2011-03-28 44 views
2

我的代碼T-SQL如下:變量在T-SQL

declare @xml xml = N' 
<a abb="122"> 
    <b> 
    </b> 
</a> 
<a abb="344"> 
    <b> 
    </b> 
</a>'; 

declare @T table (XMLCol xml); 

insert into @T values (@xml); 

declare @sql varchar(max); 
set @sql = 'update @T set 
        XMLCol.modify('' 
          replace value of (/a/@abb)[1] 
          with 888'');'; 
exec (@sql); 

當我執行,將出現一個故障段:

Msg 1087, Level 15, State 2, Line 1 
Must declare the table variable "@T". 

如何聲明變量@T被理解?

+0

爲什麼能」工作這個陳述是靜態的嗎?即哪部分是動態的呢? – 2011-03-28 11:49:44

回答

0

表格變量在內部SP中沒有看到,所以您應該定義一個沒有表格變量的臨時表格。

1

您可以使用臨時表而不是表變量。

declare @xml xml = N' 
<a abb="122"> 
    <b> 
    </b> 
</a> 
<a abb="344"> 
    <b> 
    </b> 
</a>'; 

create table #T (XMLCol xml); 

insert into #T values (@xml); 

declare @sql varchar(max); 
set @sql = 'update #T set 
        XMLCol.modify('' 
          replace value of (/a/@abb)[1] 
          with 888'');'; 
exec (@sql); 

drop table #T 
0

因爲@sql在不同的執行塊上執行,所以它不會找到它。您需要在「@sql」變量中聲明您的@t,包括與您的@t相關的所有事務。

1

如果表變量是在EXEC語句或sp_executesql存儲過程之外創建的,則無法使用EXEC語句或sp_executesql存儲過程來運行引用表變量的動態SQL Server查詢。

改爲使用臨時表。

1

因爲您需要聲明查詢的動態部分內的所有內容。 在你的情況我還是鴕鳥政策明白爲什麼你需要動態查詢,但如果it's necesary它應該看起來像:

declare @sql varchar(max); 
set @sql = ' 
declare @xml xml = N'' 
<a abb="122"> 
    <b> 
    </b> 
</a> 
<a abb="344"> 
    <b> 
    </b> 
</a>''; 

declare @T table (XMLCol xml); 
insert into @T values (@xml); 
update @T set 
        XMLCol.modify('' 
          replace value of (/a/@abb)[1] 
          with 888'');'; 
exec (@sql); 
0
declare @xml xml = N' 
<a abb="122"> 
    <b> 
    </b> 
</a> 
<a abb="344"> 
    <b> 
    </b> 
</a>'; 

declare @T table (XMLCol xml); 

insert into @T values (@xml); 


select * from @t 
update @T set XMLCol.modify('replace value of (/a/@abb)[1] with 888'); 
select * from @t 

這將爲你的結果