Sql-Server-2005

在儲存過程中,根據變數設置返回查詢的列名

  • January 25, 2017

我有一個我想重用的查詢,而不是僅僅為了更改列名而擁有許多不同的副本。

報告(例如)使用相同的查詢,但表中有狗或貓,如果有貓,則返回“Nr of Cats”,如果有狗,則返回“Nr of Dogs”作為標題返回的表。

declare @Animals table (
 AnimalType varchar(20), Name varchar(20)
 )

insert into @Animals(Type, Name) values('Cat', 'Garfield')

declare @AnimalType varchar(20)

set @AnimalType = (Select Top 1  AnimalType from @Animals )

select 
   Case when @AnimalType = 'Cat' 
          then 'Nr of Cats' 
          else 'Nr of Dogs' = count(*)  from @Animals

如果您確實希望 SQL Server 使用可變列名傳回結果,則需要為此使用動態 SQL。

舉例來說,考慮以下內容:

使用 tempdb 避免對現有對象造成任何令人討厭的意外:

USE tempdb;

創建一個表來保存範例數據。由於我們使用的是動態 SQL,因此我們不能為此使用表變數。

IF OBJECT_ID('dbo.Animals') IS NOT NULL
DROP TABLE dbo.Animals;

CREATE TABLE dbo.Animals 
(
   AnimalType varchar(20) NOT NULL
   , AnimalName varchar(20) NOT NULL
);

INSERT INTO dbo.Animals (AnimalType, AnimalName)
VALUES ('Cat', 'Garfield')
   , ('Dog', 'Lucy');

GO

使用動態 T-SQL 創建儲存過程:

IF OBJECT_ID('dbo.DynamicResults') IS NOT NULL
DROP PROCEDURE dbo.DynamicResults;
GO
CREATE PROCEDURE dbo.DynamicResults
(
   @DogsOrCats varchar(3)
)
AS
BEGIN
   SET NOCOUNT ON;
   DECLARE @msg nvarchar(1000);
   IF (@DogsOrCats = 'Dog' OR @DogsOrCats = 'Cat')
   BEGIN
       DECLARE @cmd nvarchar(max);
       DECLARE @vars nvarchar(max);
       SET @vars = '@Type varchar(20)';
       SET @cmd = 'SELECT a.AnimalType
           , [NumberOf' + @DogsOrCats + 's] = COUNT(1)
       FROM dbo.Animals a
       WHERE a.AnimalType = @Type
       GROUP BY a.AnimalType;';
       EXEC sys.sp_executesql @cmd, @vars, @Type = @DogsOrCats;
   END
   ELSE
   BEGIN
       SET @msg = '@DogsOrCats must be either ''Dog'' or ''Cat''';
       RAISERROR (@msg, 14, 1) WITH NOWAIT;
   END
END
GO

根據傳入的值,執行儲存的 proc 返回不同的結果集@DogsOrCats

EXEC dbo.DynamicResults 'Cat';

回報:

+------------+--------------+
| 動物類型 | 貓數 |
+------------+--------------+
| 貓 | 1 |
+------------+--------------+
EXEC dbo.DynamicResults 'Dog';

回報:

+------------+--------------+
| 動物類型 | NumberOfDogs |
+------------+--------------+
| 狗 | 1 |
+------------+--------------+

引用自:https://dba.stackexchange.com/questions/62130