2010-09-29 12 views
5

Sotto stored procedure menzionato sta dando errore durante la creazioneStored sintassi procedura di errore (MSSQL)

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

Qualcuno può dirmi l'errore?

Di seguito si riporta lo script:

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 

risposta

6

Che assomiglia a una procedura originariamente utilizzato per SQL Server 2000 in cui pivot non era una parola chiave. Cambia la sezione seguente per utilizzare [pivot] invece.

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 

Probabilmente si dovrebbe anche usare sysname tipo di dati per il parametro @table, utilizzare la funzione quotename quando concatenando i nomi di tabella e di colonna e utilizzare nvarchar invece di varchar.

Questi sono tutti suggerimenti volti a ridurre le possibilità di iniezione SQL e consentono di gestire nomi di oggetti non standard. Attualmente sysname è nvarchar(128). Utilizzando sysname anziché nvarchar(128), non sarà necessario aggiornare la procedura se questo cambia in una versione futura.

L'utilizzo di varchar(100) indica che la procedura non sarà in grado di gestire nomi di oggetti (validi) superiori a 100 caratteri. Oltre a non essere in grado di gestire nomi validi contenenti caratteri non standard.

Il seguente is allowed in SQL Server

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

Anche se è il nome solo le tabelle e le colonne che utilizzano caratteri ASCII mantenendo i parametri e le variabili come unicode impedirà questioni come il carattere ʼ (U + 02BC) in silenzio di essere convertito in un apostrofo regolare.

quotename assicurerà che se si dispone di colonne denominate Robert'); DROP TABLE Students;, queste sono corrette correttamente come [Robert'); DROP TABLE Students;] e si occupano di parentesi quadre incorporate nei nomi degli oggetti.

+0

molto. cosa intendi per sysname e quotename ?? – Thakur

+0

@Aamod - Vedi modifica. –

3

Pivot è una parola chiave SQL. Quindi è necessario racchiuderlo tra parentesi quadre.

Problemi correlati