Sql-Server-2005
在儲存過程中,根據變數設置返回查詢的列名
我有一個我想重用的查詢,而不是僅僅為了更改列名而擁有許多不同的副本。
報告(例如)使用相同的查詢,但表中有狗或貓,如果有貓,則返回“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 | +------------+--------------+