3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個贊
您的EXEC在不同的上下文中執(zhí)行,因此它不知道在原始上下文中已聲明的任何變量。您應(yīng)該能夠使用臨時表而不是表變量,如下面的簡單演示所示。
create table #t (id int)
declare @value nchar(1)
set @value = N'1'
declare @sql nvarchar(max)
set @sql = N'insert into #t (id) values (' + @value + N')'
exec (@sql)
select * from #t
drop table #t

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個贊
在SQL Server 2008+上,可以使用表值參數(shù)將表變量傳遞給動態(tài)SQL語句,只要您不需要更新表本身中的值即可。
因此,從您發(fā)布的代碼中,您可以將這種方法用于@TSku但不能用于@RelPro
下面的示例語法。
CREATE TYPE MyTable AS TABLE
(
Foo int,
Bar int
);
GO
DECLARE @T AS MyTable;
INSERT INTO @T VALUES (1,2), (2,3)
SELECT *,
sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
FROM @T
EXEC sp_executesql
N'SELECT *,
sys.fn_PhysLocFormatter(%%physloc%%) AS [physloc]
FROM @T',
N'@T MyTable READONLY',
@T=@T
physloc包含該列只是為了證明子作用域中引用的表變量絕對與外部作用域相同,而不是副本。

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個贊
你不具備使用動態(tài)SQL
update
R
set
Assoc_Item_1 = CASE WHEN @curr_row = 1 THEN foo.relsku ELSE Assoc_Item_1 END,
Assoc_Item_2 = CASE WHEN @curr_row = 2 THEN foo.relsku ELSE Assoc_Item_2 END,
Assoc_Item_3 = CASE WHEN @curr_row = 3 THEN foo.relsku ELSE Assoc_Item_3 END,
Assoc_Item_4 = CASE WHEN @curr_row = 4 THEN foo.relsku ELSE Assoc_Item_4 END,
Assoc_Item_5 = CASE WHEN @curr_row = 5 THEN foo.relsku ELSE Assoc_Item_5 END,
...
from
(Select relsku From @TSku Where tid = @curr_row1) foo
CROSS JOIN
@RelPro R
Where
R.RowID = @curr_row;
- 3 回答
- 0 關(guān)注
- 2010 瀏覽
添加回答
舉報