T-SQL,在一个SELECT中为同一列中的多个变量赋值

时间:2015-12-01 17:15:01

标签: sql-server tsql

我想把变量操作成像枚举一样,

CREATE TABLE dbo.ActionType
(
    ActionID INT,
    Name NVARCHAR(30)
)

INSERT INTO dbo.ActionType 
    (ActionID, Name)
VALUES 
    (100, N'Product_Insert'), 
    (101, N'Product_Update'), 
    (102, N'Product_Delete')

DECLARE @ACTION_INSERT TINYINT,
        @ACTION_UPDATE TINYINT,
        @ACTION_DELETE TINYINT

SELECT  @ACTION_INSERT = ActionID, 
        @ACTION_UPDATE = ??, -- how would I do this properly?
        @ACTION_DELETE = ??  -- or is it possible?
FROM dbo.ActionType
WHERE Name LIKE 'Product_%'

-- Test result, which always returns null
SELECT @ACTION_INSERT, @ACTION_UPDATE, @ACTION_DELETE

我知道我可以使用CURSOR,但有没有更好的方法可以在没有迭代的情况下执行此操作?

1 个答案:

答案 0 :(得分:2)

您需要透视数据以获得所需的结果。

SELECT  @ACTION_INSERT = MAX(CASE WHEN Name = 'Product_Insert' THEN ActionID END), 
        @ACTION_UPDATE = MAX(CASE WHEN Name = 'Product_Update' THEN ActionID END),
        @ACTION_DELETE = MAX(CASE WHEN Name = 'Product_Delete' THEN ActionID END)
FROM dbo.ActionType
WHERE Name LIKE 'Product_%'

完整代码:

CREATE TABLE dbo.ActionType
(
    ActionID INT,
    Name NVARCHAR(30)
)

INSERT INTO dbo.ActionType 
    (ActionID, Name)
VALUES 
    (100, N'Product_Insert')
INSERT INTO dbo.ActionType 
    (ActionID, Name)
VALUES      
    (101, N'Product_Update') 
INSERT INTO dbo.ActionType 
    (ActionID, Name)
VALUES 
    (102, N'Product_Delete')

DECLARE @ACTION_INSERT INT,
        @ACTION_UPDATE INT,
        @ACTION_DELETE INT

SELECT  @ACTION_INSERT = MAX(CASE WHEN Name = 'Product_Insert' THEN ActionID END), 
        @ACTION_UPDATE = MAX(CASE WHEN Name = 'Product_Update' THEN ActionID END),
        @ACTION_DELETE = MAX(CASE WHEN Name = 'Product_Delete' THEN ActionID END)
FROM dbo.ActionType
WHERE Name LIKE 'Product_%'

SELECT @ACTION_INSERT, @ACTION_UPDATE, @ACTION_DELETE