簡體   English   中英

在動態SQL中添加表變量

[英]Adding a table variable in Dynamic SQL

我是Dynamic SQL的初學者,試圖編寫一個動態sql代碼,其中需要包含一個表變量。當嘗試包含該表變量時,出現一個錯誤,提示我需要包含Static變量。

下面只是代碼的一部分

DECLARE @NAMES TABLE (name varchar)
DECLARE @fields varchar(max);
.
.
.
Select @fields=FROM sys.columns
WHERE object_id=object_id('dbo.employees') 
order by name
SET @SQL=''
SET @SQL='Select '+ @fields
SET @SQL=@SQL + ' from dbo.test()' 
SET @SQL = @SQL + ' WHERE name IN'
SET @SQL= @SQL + '(Select name from ' 
SET @SQL=@SQL + @NAMES +')'

首先,用於獲取列名的SELECT根本不起作用。 您需要這樣的東西:

DECLARE @fields nvarchar(max);
SET @fields = N'';
SELECT @fields += CASE WHEN LEN(@fields) = 0 THEN N'' ELSE N', ' END + name
  FROM sys.columns
 WHERE object_id=object_id('dbo.employees') 
 ORDER BY column_id
PRINT @fields;

老實說,我不確定您的SQL其余部分想做什么...它正在嘗試從表值函數test()的返回中從employee表中選擇字段? 該test()結果集中的“名稱”列在哪里……是什么? 在我給您完整的答案之前,您需要更加清楚。 一個主要問題是您實際上從未在表變量中填充任何內容,所以...我不知道您要做什么。 知道Test()函數的定義也將有所幫助。

但是至少上面的方法會為您提供@fields變量,並將其正確設置為表dbo.employee中的列列表。

在執行動態SQL時,確實有助於寫出所需的最終SQL,然后確定變量數據應填充該SQL的哪些部分並向后工作。 這樣,構建SQL來構建動態SQL會容易得多。

您需要將tablevariable邏輯包括到動態sql中

--You need to load @names inside dynamic sql
DECLARE @fields varchar(max);
.
.
.
Select @fields=FROM sys.columns
WHERE object_id=object_id('dbo.employees') 
order by name
SET @SQL='DECLARE @NAMES TABLE (name varchar); '
SET @SQL +=' Select '+ @fields
SET @SQL=@SQL + ' from dbo.test()' 
SET @SQL = @SQL + ' WHERE name IN'
SET @SQL= @SQL + '(Select name from ' 
SET @SQL=@SQL + ' @NAMES )'

或者,您可以加載到臨時表中並在動態sql中訪問該臨時表。 這意味着您將像#names一樣加載臨時表,然后在動態sql中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM