Tsql T-SQL中的变量

Tsql T-SQL中的变量,tsql,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)

我的代码是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);

如何声明变量@T以便于理解?

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

您可以使用临时表而不是表变量

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

因为@sql是在不同的执行块上执行的,所以它找不到它。您需要在@sql变量内声明@t,包括与@t相关的所有事务。

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


改用临时表。

因为您需要声明查询动态部分中的所有内容。 在您的情况下,我仍然不理解为什么需要动态查询,但如果需要,它应该如下所示:

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

这将对您的结果起作用

为什么这个语句不能是静态的?也就是说,它的哪个部分是动态的?
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);
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