2010-09-29 12 views
5

procédure ci-dessous mentionnée stockée donne erreur lors de la créationsyntaxe de procédure stockée Erreur (MSSQL)

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

Quelqu'un peut-il s'il vous plaît me dire l'erreur?

est Ci-dessous le 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 

Répondre

6

qui ressemble à une procédure utilisée à l'origine pour SQL Server 2000 où pivot était pas un mot-clé. Changez la section ci-dessous pour utiliser [pivot] à la place.

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 

Vous devriez utiliser probablement sysname type pour le paramètre @table de données, utilisez la fonction quotename lorsque concaténer la table et les noms de colonnes et utiliser nvarchar plutôt que varchar.

Toutes ces suggestions visent à réduire les possibilités d'injection SQL et à traiter les noms d'objets non standard. Actuellement sysname est nvarchar(128). En utilisant sysname au lieu de nvarchar(128) bien que vous n'ayez pas à mettre à jour la procédure si cela change dans une future version. L'utilisation de varchar(100) signifie que votre procédure ne pourra pas gérer les noms d'objets (valides) supérieurs à 100 caractères. En plus de ne pas pouvoir gérer les noms valides contenant des caractères non standard.

Voici is allowed in SQL Server

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

Même si vous ne nommer que vos tables et colonnes en utilisant des caractères ASCII en gardant vos paramètres et variables comme unicode empêchera des questions telles que le caractère ʼ (U + 02BC) en silence étant converti en une apostrophe régulière.

quotename veillera à ce que si vous avez des colonnes dites Robert'); DROP TABLE Students; que ceux-ci sont correctement se sont échappés comme [Robert'); DROP TABLE Students;] ainsi que les relations avec les crochets intégrés dans les noms d'objets.

+0

beaucoup. wt voulez-vous dire par sysname et quotename ?? – Thakur

+0

@Aamod - Voir édition. –

3

Pivot est un mot-clé SQL. Vous devez donc l'inclure entre crochets.