簡體   English   中英

在 SQL Server 存儲過程中動態創建和選擇表變量?

[英]Creating and Selecting table variables dynamically in SQL Server stored procedure?

請指導我如何動態創建表變量。 我知道它可以是這樣的:

DECLARE @people TABLE 
( 
    id INT, 
    name VARCHAR(32) 
);

如果不知道列和數據類型,我將如何創建。 場景是我必須根據物理表創建表變量並將數據選擇到其中,在 SP 中使用它們,然后將表變量中的數據返回到 C# 程序。

例如我有一張員工表。 我想創建一個與 Employyes 具有相同結構的表變量。 但是提到列需要很多時間(因為員工有大約 100 列)

請指教。

因此,您可以通過以下方式動態構建DECLARE TABLE語句:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';


SELECT @sql = @sql + ',
' + c.name + ' ' + t.name
 + CASE
  WHEN t.name LIKE '%char' OR t.name LIKE '%binary' THEN
   '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE
   CONVERT(VARCHAR(4), c.max_length/CASE WHEN t.name LIKE 'n%'
   THEN 2 ELSE 1 END) END + ')'
  WHEN t.name IN ('float') THEN
      '(' + CONVERT(VARCHAR(4), c.precision) + ')'
  WHEN t.name IN ('decimal', 'numeric') THEN
   '(' + CONVERT(VARCHAR(4), c.precision) + ','
   + CONVERT(VARCHAR(4), c.scale) + ')'
  ELSE ''
 END
 FROM sys.columns AS c
 INNER JOIN sys.types AS t
 ON c.system_type_id = t.system_type_id
 AND c.user_type_id = t.user_type_id
 WHERE c.[object_id] = OBJECT_ID('dbo.Employees')
 ORDER BY c.column_id;

SET @sql = 'DECLARE @people TABLE (' + STUFF(@sql, 1, 1, '') + '
);';

SELECT @sql;

但是現在呢? 你不能從動態 SQL 的范圍之外插入它:

EXEC sp_executesql @sql;
INSERT @people(id, name) SELECT 1,'foo';

產生這個錯誤:

Msg 1087, Level 15, State 2, ...
Must declare the table variable "@people".

再一次,一個范圍問題 - @people只存在於動態 SQL 中,一旦完成就不再存在。 因此,雖然您可以繼續@sql變量:

SET @sql = @sql + 'INSERT @people ...; SELECT id, name FROM @people;';

...這將很快失控。 而且我仍然不知道您的 C# 代碼如何知道所涉及的所有列和數據類型,但是編寫 SQL 來做到這一點太難了……您知道可以將列節點從對象資源管理器拖到查詢上窗口,它會為您生成一個很好的逗號分隔的列名列表,對嗎?

您可以查詢系統表以查找表所包含的列的名稱和類型。 請參閱此問題及其答案。

然后,您可以獲取此信息並生成將創建表值類型的腳本。

但是,這對客戶端無濟於事,因為它需要了解返回數據的類型和值。

暫無
暫無

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

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