【发布时间】:2015-01-23 13:46:13
【问题描述】:
如果这是重复的,我深表歉意,但我已经搜索了这个网站,但我无法找到一个简单的答案来解决必须是常见问题的问题。
我有一个存储过程,它接受多个参数,但其中三个是标志。对于每个标记为“Y”的标志,我需要在IN 子句中插入一个值。换句话说,请考虑以下代码。
CREATE PROC testProc
@FlagA char(1),
@FlagB char(1),
@FlagC char(1)
AS
--... Do stuff...
IF (@FlagA = 'Y')
--Add 'AVal' to IN list
IF (@FlagB = 'Y')
--Add 'BVal' to IN list
IF (@FlagC = 'Y')
--Add 'CVal' to IN list
--... Do more stuff...
SELECT * FROM myTable
WHERE testField -- Insert correct IN clause.
这是我的代码试图完成的原因的一个极其简单的版本。我可以想出多种解决这种困境的方法,但没有一种方法感觉正确。
我能想出的最佳解决方案是定义一个包含一个字段的临时表。对于设置的每个标志,我可以将相应的值添加到临时表中,然后使用...IN (SELECT * FROM #temp) 语句。
这是正确的方法还是对这个问题有更正确的解决方案?如果我的解决方案是最佳答案,我很好,但是,每当我看到临时表的简单用法时,我常常怀疑是否有更好的方法。
任何清晰度将不胜感激。谢谢。
【问题讨论】:
-
这是一个很酷的方法。将值添加到临时表,然后从临时表中选择执行 IN。好的!我和你在一起,我遇到过几次,动态 sql(很明显)或另一个变量,它以正确的“IN”形式('Y','N')保存标志的连接值
-
虽然您以不同的方式到达您的列表,但解决方案的其余部分与此处相同(希望我每次发布此链接作为答案时都能获得报酬):vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
-
感谢大家的回复。三脚架链接(大声笑..三脚架,哈哈!)可以用于将来的参考,但一般来说,我尽量避免 SQL 中的两件事——带有 EXEC() 语句和临时表的动态 SQL。是的,每个都有它的位置,但正如我所提到的,当一个问题看起来很常见和简单时,我无法相信没有一个不涉及这两种方法中的任何一种的内置“正确”解决方案。跨度>
-
@TabAlleman 请停止发布该链接作为答案;-)。它已经过时了。它显示的大多数拆分 CSV 列表的方式都非常慢。它确实提到了一个数字表和 INNER JOIN 选项,但在其他方面更有可能让某人使用一种低效的方法而不是一种好的方法。为了记录,拆分 CSV 列表几乎总是通过 CLR 函数最快完成。
标签: sql-server tsql in-clause