4
DECLARE @TablesList TABLE
(
TableName VARCHAR(500),
RefTable VARCHAR(500),
RefTableIDColumn VARCHAR(500)
)
DECLARE @Query AS VARCHAR(MAX)
SET @Query = 'DECLARE @badIds AS VARCHAR(500) DECLARE @TableXML AS XML'
SET @Query = @Query + ' SELECT @TableXML = xCol FROM (SELECT * FROM OPENROWSET (BULK ''\\10.0.0.60\Temp\path\DataItemTables.xml'', SINGLE_CLOB)AS xCol) AS R(xCol)'
SET @Query = @Query + ' INSERT INTO @TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,'
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM'
SET @Query = @Query + ' @TableXML.nodes(''//Table[@name="Description"]'') AS R(ref)'
SET @Query = @Query +'select * from @TablesList'
EXEC(@Query)
我正在執行上述腳本。但我得到如下錯誤從sql服務器中的XML文件中提取XML數據時出錯
Msg 1087, Level 15, State 2, Line 1
Must declare the table variable "@TablesList".
Msg 1087, Level 15, State 2, Line 1
Must declare the table variable "@TablesList".
我做錯了什麼。但是當我用下面的動態形式編寫查詢時,它可以正常工作。問題是我想刪除SP的所有動態部分。
DECLARE @Query AS VARCHAR(MAX)
SET @Query ='DECLARE @TablesList TABLE (TableName VARCHAR(500),RefTable VARCHAR(500),RefTableIDColumn VARCHAR(500))'
SET @Query = @Query + ' DECLARE @badIds AS VARCHAR(500) DECLARE @TableXML AS XML'
SET @Query = @Query + ' SELECT @TableXML = xCol FROM (SELECT * FROM OPENROWSET (BULK ''\\10.0.0.60\Temp\Path\DataItemTables.xml'', SINGLE_CLOB)AS xCol) AS R(xCol)'
SET @Query = @Query + ' INSERT INTO @TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,'
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM'
SET @Query = @Query + ' @TableXML.nodes(''//Table[@name="Description"]'') AS R(ref)'
SET @Query = @Query +'select * from @TablesList'
EXEC(@Query)
它的工作,謝謝。我可以使上述查詢更靜態而不是動態。 – user2998990
當然,我會把它留給你作爲練習。 –
@ user2998990你有任何理由使用動態SQL嗎?如果您將'EXEC(@Query)'更改爲''SELECT @ Query',那麼您將得到查詢的文本而不需要很多工作,只需要一些格式化。不要忘記將輸出的文本長度設置爲8192(最大值),否則SSMS將不會顯示整個區域... – Shnugo