如何在条件语句中调用变量(即值列表)?
问题描述:
我正在尝试创建一个过程,其中条件语句根据用户输入的值进行更改。下面是我想要实现的简化示例。如何在条件语句中调用变量(即值列表)?
Create Procedure [LossRatioReport] (@construction AS VARCHAR(2), @state AS VARCHAR(2)) AS
DECLARE @construction_condition AS NVARCHAR(MAX)
DECLARE @construction AS VARCHAR(2)
SET @construction = '01'
SET @construction_condition = CASE @construction WHEN '01'
THEN @construction_condition = '('01', 'Frame Construction', 'Frame')'
ELSE @construction_condition = '00'
END
BEGIN
SELECT year, SUM(loss)
FROM Database_1
WHERE id IN (SELECT DISTINCT id FROM Database_2 WHERE construction = @construction_condition)
END
GO
我想这样做这种方式,因为有整数和字符串每种类型的列表,我不想一遍又一遍地重写代码为每个条件。但是当我尝试运行我的代码时,我不断收到WHERE语句中变量的错误语法消息。
答
你需要使用动态SQL这样的:
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = 'SELECT year, SUM(loss)
FROM Database_1
WHERE id IN (SELECT DISTINCT id FROM Database_2 WHERE construction IN(' + @construction_condition
EXEC sp_executesql @sql
肖恩兰格说,事情或许应该被SQL注入提及。在使用动态SQL实施解决方案之前,请确保您意识到危险。 Here is an overview,谷歌可以告诉你很多,更多。
+0
您需要将“=”更改为“IN”。可怕的部分是这是广泛开放的SQL注入。 – 2014-11-24 19:24:46
+0
我想作为一个varchar(2)它不是超级开放的,但变量声明可能会改变。 ;) – 2014-11-24 19:25:34
你不能这样做,就像你正在尝试。有一件事你在你的案例表达式中遍布着无效的字符串。要做到这一点,你需要动态的SQL。我会非常不愿意这样做,因为你需要参数化你的动态sql,因为这是来自一个参数。似乎最好的方法是重新考虑这一点。 – 2014-11-24 19:23:57
您可以创建一个只存储ID的临时表。根据条件,使用您感兴趣的ID填充临时表,并在其中添加“where id in(从#tmp选择[ID])” – Jeremy 2014-11-24 19:44:55