T-SQL中的变量

时间:2011-03-28 09:18:40

标签: tsql

我的代码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才能理解?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果表变量是在EXEC语句或sp_executesql存储过程之外创建的,则不能使用EXEC语句或sp_executesql存储过程来运行引用表变量的动态SQL Server查询。

改为使用临时表。

答案 2 :(得分:1)

因为您需要在查询的动态部分内声明所有内容。 在你的情况下,我仍然不明白为什么你需要动态查询,但如果它是必要的,它应该看起来像:

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);

答案 3 :(得分:0)

在内部SP中看不到表变量,因此您应该定义一个临时表而不是表变量。

答案 4 :(得分:0)

因为你的@sql是在不同的执行块上执行的,所以它找不到它。你需要在“@sql”变量中声明你的@t,包括与你的@t相关的所有交易。

答案 5 :(得分:0)

var allColumns = grid.getView().getHeaderCt().getGridColumns();

这适用于您的结果