gpt4 book ai didi

sql - 存储过程语法错误(MSSQL)

转载 作者:行者123 更新时间:2023-12-02 22:55:32 27 4
gpt4 key购买 nike

下面提到的存储过程在创建时出错

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

谁能告诉我错误吗?

下面是脚本:

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 @sql=@sql + '''' + 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

最佳答案

这看起来像是最初用于 SQL Server 2000 的过程,其中 pivot 不是关键字。更改以下部分以使用 [pivot] 代替。

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

您可能还应该使用 sysname 数据类型作为 @table 参数,在连接表名和列名时使用 quotename 函数,并且使用 nvarchar 而不是 varchar。

这些都是旨在减少 SQL 注入(inject)可能性并允许您处理非标准对象名称的建议。当前sysnamenvarchar(128)。通过使用 sysname 而不是 nvarchar(128),尽管在​​ future 版本中发生更改,您不必更新该过程。

使用 varchar(100) 意味着您的过程将无法处理超过 100 个字符的(有效)对象名称。以及无法处理包含非标准字符的有效名称。

以下is allowed in SQL Server

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

即使您仅使用 ASCII 字符命名表和列,将参数和变量保留为 unicode 也可以防止诸如 ´ 字符 (U+02BC) 默默地转换为常规撇号之类的问题。

quotename 将确保您是否有任何名为 Robert') 的列; DROP TABLE 学生; 这些已正确转义为 [Robert'); DROP TABLE Students;] 以及处理对象名称中任何嵌入的方括号。

关于sql - 存储过程语法错误(MSSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3821860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com