2010-09-29 9 views
5

Im Folgenden erwähnte gespeicherte Prozedur wird Fehler geben beim ErstellenGespeicherte Prozedur Syntax Error (MSSQL)

Msg 156, Level 15, State 1, Procedure crosstab, Line 23 
Incorrect syntax near the keyword 'pivot'. 

Kann jemand mir bitte den Fehler sagen?

unten ist das Skript:

CREATE PROCEDURE crosstab 
@select varchar(8000), 
@sumfunc varchar(100), 
@pivot varchar(100), 
@table varchar(100) 
AS 

DECLARE @sql varchar(8000), @delim varchar(1) 
SET NOCOUNT ON 
SET ANSI_WARNINGS OFF 

EXEC ('SELECT ' + @pivot + ' AS pivot INTO ##pivot FROM ' + @table + ' WHERE 1=2') 
EXEC ('INSERT INTO ##pivot SELECT DISTINCT ' + @pivot + ' FROM ' + @table + ' WHERE ' 
+ @pivot + ' Is Not Null') 

SELECT @sql='', @sumfunc=stuff(@sumfunc, len(@sumfunc), 1, ' END)') 

SELECT @delim=CASE Sign(CharIndex('char', data_type)+CharIndex('date', data_type)) 
WHEN 0 THEN '' ELSE '''' END 
FROM tempdb.information_schema.columns 
WHERE table_name='##pivot' AND column_name='pivot' 

SELECT @[email protected] + '''' + convert(varchar(100), pivot) + ''' = ' + 
stuff(@sumfunc,charindex('(', @sumfunc)+1, 0, ' CASE ' + @pivot + ' WHEN ' 
+ @delim + convert(varchar(100), pivot) + @delim + ' THEN ') + ', ' FROM ##pivot 

DROP TABLE ##pivot 

SELECT @sql=left(@sql, len(@sql)-1) 
SELECT @select=stuff(@select, charindex(' FROM ', @select)+1, 0, ', ' + @sql + ' ') 

EXEC (@select) 
SET ANSI_WARNINGS ON 

Antwort

6

, das wie ein Verfahren ursprünglich für SQL Server 2000 verwendet, sieht, wo pivot kein Schlüsselwort war. Ändern Sie den folgenden Abschnitt, um stattdessen [pivot] zu verwenden.

SELECT @[email protected] + '''' + convert(varchar(100), [pivot]) + ''' = ' + 
stuff(@sumfunc,charindex('(', @sumfunc)+1, 0, ' CASE ' + @pivot + ' WHEN ' 
+ @delim + convert(varchar(100), [pivot]) + @delim + ' THEN ') + ', ' FROM ##pivot 

Sie sollten wahrscheinlich sysname Datentyp für den @table Parameter verwenden auch, verwenden Sie die quotename Funktion, wenn die Tabellen- und Spaltennamen verketten und verwenden nvarchar statt varchar.

Dies sind Vorschläge, die darauf abzielen, die SQL-Injizierungsmöglichkeiten zu reduzieren und Ihnen die Behandlung von nicht standardmäßigen Objektnamen zu ermöglichen. Derzeit ist sysnamenvarchar(128). Bei Verwendung von sysname anstelle von nvarchar(128) müssen Sie das Verfahren jedoch nicht aktualisieren, wenn sich dies in einer zukünftigen Version ändert.

Die Verwendung von varchar(100) bedeutet, dass Ihre Prozedur (gültige) Objektnamen mit mehr als 100 Zeichen nicht verarbeiten kann. Außerdem können Sie keine gültigen Namen mit nicht standardmäßigen Zeichen verarbeiten.

Die folgende is allowed in SQL Server

CREATE TABLE "╚╦╩╗" ("└┬┴┐" nvarchar(10)) 

Selbst wenn Sie nur Ihre Tabellen und Spalten benennen Sie Ihre Parameter und Variablen als Unicode mit ASCII-Zeichen halten wird Probleme verhindern, wie die ʼ Zeichen (U + 02BC) still umgewandelt wird zu ein regulärer Apostroph.

quotename wird sichergestellt, dass, wenn Sie irgendwelche Spalten mit dem Namen Robert'); DROP TABLE Students; haben, dass diese richtig als [Robert'); DROP TABLE Students;] Escorted sowie Umgang mit beliebigen eingebetteten eckigen Klammern in Objektnamen.

+0

thnks viel. wt meinst du mit sysname und quotename ?? – Thakur

+0

@Aamod - Siehe bearbeiten. –

3

Pivot ist ein SQL-Schlüsselwort. Sie müssen es also in eckige Klammern setzen.