2014-11-24 101 views
0

我正在尝试创建一个过程,其中条件语句根据用户输入的值进行更改。下面是我想要实现的简化示例。如何在条件语句中调用变量(即值列表)?

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语句中变量的错误语法消息。

+0

你不能这样做,就像你正在尝试。有一件事你在你的案例表达式中遍布着无效的字符串。要做到这一点,你需要动态的SQL。我会非常不愿意这样做,因为你需要参数化你的动态sql,因为这是来自一个参数。似乎最好的方法是重新考虑这一点。 – 2014-11-24 19:23:57

+1

您可以创建一个只存储ID的临时表。根据条件,使用您感兴趣的ID填充临时表,并在其中添加“where id in(从#tmp选择[ID])” – Jeremy 2014-11-24 19:44:55

回答

1

你需要使用动态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

相关问题