我想把变量操作成像枚举一样,
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,但有没有更好的方法可以在没有迭代的情况下执行此操作?
答案 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