有没有办法将WHERE子句声明存储为可调用变量?
我需要使用不同的'日期'运行下面的查询大约20次。和' ID'价值观,但'代码'价值观将保持不变。但是,在20个查询之后,我需要更改“代码”。值为另一组值并使用相同的20'日期'和' ID'组合
我正在使用SQL Server Management Studio 2012。
编辑:这实际上是一个子查询,用于计算由此产生的记录数。每个计数查询都联合到其他计数查询,因此我可以一次执行所有查询,并使结果显示带有计数的1列。我想知道如何制作一个带有结果的excel表,其中每列都特定于' Code'但是我还没看好它。
SELECT DISTINCT a,b,c
FROM mytable
WHERE (Code BETWEEN '201' AND '205') OR (Code BETWEEN '211' AND '215') OR (Code BETWEEN '241' AND '245') OR (Code = '450')
OR (Code BETWEEN '381' AND '387') OR (Code BETWEEN '391' AND '397') OR (Code BETWEEN '401' AND '420') OR (Code BETWEEN '441' AND '444')
OR (Code BETWEEN '358' AND '360') OR (Code BETWEEN '371' AND '937') OR (Code = '499') OR (Code BETWEEN '218' AND '239'))
AND (Date > '20101231' AND Date < '20120101')
AND (ID IN ('3','6','7'))
我的代码值如何变化:
WHERE (Code IN ('791','792'))
OR (Code BETWEEN '801' AND '899')
OR (Code BETWEEN '101' AND '125')
OR (Code BETWEEN '401' AND '429')
WHERE (Code BETWEEN '281' AND '749') OR Code = '2037'
还有2个其他代码列表,总共5个,涉及BETWEEN,IN和=语句。如果它有帮助,我也可以发布这些内容,但它们遵循与上述相同的声明方式。
日期值可以是日历年或季度。 ID值可以通过IN,NOT IN或=表示。它们都是char,varchar,tinyint或date。
替代方法:我可以一遍又一遍地复制和粘贴替换代码,但希望提高我的编码能力。此外,查找和替换只读取单行。我不能让它适用于多行,例如WHERE子句。我听说过正则表达式,但不知道如何使用它们来做我想做的事。
感谢您的帮助!
答案 0 :(得分:3)
如果这是一个即席查询,您只需要手动运行几次,这很难看但是正确。
如果您经常这样做,可以将值存储在另一个表中。你可以有一个名为&#34; coderange&#34;有两列,&#34; minCode&#34;和&#34; maxCode&#34;。然后你重写了这个查询:
SELECT DISTINCT a,b,c
FROM mytable m
JOIN coderange c
WHERE Code Between c.minCode and c.maxCode
AND Date > '20101231'
AND Date < '20120101'
AND ID IN ('3','6','7');
答案 1 :(得分:1)
我可能会创建一个参数化的存储过程,然后使用正确的值一遍又一遍地调用它。
一些链接:
其他一些选项是使用动态SQL执行此操作或创建基本的.NET包装器,以创建所需的查询并执行它。
答案 2 :(得分:0)
在这种情况下,我将使用变量表来存储代码值,如下所示
这里的@t表是一个变量表,即内存表,但它也可以是一个永久表
该表包含一个名为key的值,键列将包含您要存储的每组代码范围的整数。
对于以下示例,我放下了一组值1和2。
declare @t TABLE
(
key INT, FROM_code VARCHAR(10), TO_CODE VARCHAR(10)
)
insert into @T VALUES (1,'791','792')
insert into @T VALUES (1,'801','899')
insert into @T VALUES (1,'101','125')
insert into @T VALUES (1,'401','429')
Insert into @t values (2,'281','749')
Insert into @t values (2,'2037','2037')
现在,在where where语句可以写成如下
Declare @KEY INT
-- PASS key as input parameter to the stored procedure.
Set @key =1
SELECT distinct a,b,c
From <my_table> M
JOIN @T T
ON T.key = @key
WHERE m.code between from_code and to_code
对于第二次迭代,只需用@ key = 2
替换@ key = 1