我想在存储过程中使用动态SQL来创建表 .
这是对存储过程的调用:
EXEC [spCreateAColDiffTable] 'hq193.dbo.arch_con_col_s193_s202'
以下是存储过程的相关部分:
CREATE PROCEDURE sp_createAColDiffTable (@table_name nvarchar(128))
...
SET @sSQL = 'CREATE TABLE ' + @table_name + ' ( ' +
' [table_name] VARCHAR (128) NOT NULL, ' +
' [column_name] VARCHAR (128) NULL, ' +
' [what_changed] VARCHAR (128) NULL, ' +
' [sr_data_type] VARCHAR (128) NOT NULL, ' +
' [tr_data_type] VARCHAR (128) NOT NULL, ' +
' [sr_max_length] SMALLINT NOT NULL, ' +
' [tr_max_length] SMALLINT NOT NULL, ' +
' [sr_is_nullable] CHAR NULL, ' +
' [tr_is_nullable] CHAR NULL, ' +
' [sr_precision] SMALLINT NULL, ' +
' [tr_precision] SMALLINT NULL, ' +
' [sr_scale] SMALLINT NULL, ' +
' [tr_scale] SMALLINT NULL ) ' +
' ON [PRIMARY] WITH (DATA_COMPRESSION = NONE)'
PRINT @sSQL
Exec @sSQL
走
当我运行存储过程时,我收到错误:
SQL Server数据库错误:名称'CREATE TABLE hq193.dbo.arch_con_col_s193_s202([table_name] VARCHAR(128)NOT NULL,[column_name] VARCHAR(128)NULL,[what_changed] VARCHAR(128)NULL,[sr_data_type] VARCHAR( 128)NOT NULL,[tr_data_type] VARCHAR(128)NOT NULL,[sr_max_length] SMALLINT NOT NULL,[tr_max_length] SMALLINT NOT NULL,[sr_is_nullable] CHAR NULL,[tr_is_nullable] CHAR NULL,[sr_precision] SMALLINT NULL,[tr_precision] SMALLINT NULL,[sr_scale] SMALLINT NULL,[tr_scale] SMALLINT NULL)ON [PRIMARY] WITH(DATA_COMPRESSION = NONE)'不是有效的标识符 .
请注意,在执行存储过程之前,我打印出了SQL . 如果我将打印的SQL剪切并粘贴到查询编辑器窗口中,它可以正常工作 .
我错过了什么?
2 回答
试试这样:
这是一个非常常见的错误 . 如果没有括号,
EXEC @sSQL
表示“执行名称在@sSQL变量中的存储过程", rather than what you want which is probably "在变量@sSQL中执行命令字符串” .我看到这是一篇旧帖子,但是我有一个类似的问题,我需要阅读一个文本文件,其中列可能会根据文件的拉取方式而变化越来越少 . 所以我编写了一个程序来读取文本文件并将其放入动态创建的临时表中,我可以在其中处理输出 .
也许这可以帮助别人..