我想在存儲過程中使用動態SQL來創建表格。使用動態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
GO
當我跑步存儲過程我收到錯誤:在存儲的步驟之前執行我它我打印出SQL
SQL Server Database Error: The name '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)'
is not a valid identifier.
的通知。如果我將要打印的SQL剪切並粘貼到查詢編輯器窗口中,它可以正常工作。
我錯過了什麼?
雖然答案是正確的,我會建議使用'EXEC sp_executesql的@ sSQL'動態SQL。有關更多信息,請參見[this](http://www.sommarskog.se/dynamic_sql.html)。 – seph
我對Erland的工作和編寫非常熟悉,並且我沒有意識到在這種情況下使用'sp_ExecuteSql'超過'EXEC(..)'的好理由。由於它的本性,我認爲這是一個操作過程,並不適用於Apps/OLTP,所以SQL注入應該不是問題(無論如何,單獨使用sp_ExecuteSql本身並不能解決這個問題)。至於性能,這是DDL,因此預編譯查詢計劃的優勢在這裏不起作用。 – RBarryYoung
我更喜歡sp_executesql,因爲它提供了一個好習慣。爲什麼在一個重要的方法和另一個不重要的方法中使用一種方法,而不是總是使用可能很重要的方法? –