使用SQL Server的“IN”条件条件的局部变量

时间:2011-07-14 14:29:46

标签: sql sql-server-2005 criteria dynamic-sql

  

可能重复:
  SQL : in clause in storedprocedure:how to pass values

我正在使用MS SQL Server 2005,并试图基本编写一个两步过程:

  1. 查询表格以查找符合特定条件的ID列表
  2. 更新该表中的字段,其中ID位于第一个
  3. 返回的ID列表中

    抓住的是,步骤1和2可能会分开相当长的时间并在不同的会话中执行。 #2中使用的ID列表必不可少的是历史数据:#1在过去的时间点返回的值。

    我试图将#1中的所有ID写入varchar(8000)中的“##,##,##,##,”格式(此部分工作正常),然后使用该字符串,如:

    UPDATE table SET field=newValue WHERE (id IN (@varcharOfCommaSeparatedIDs))
    

    但是这给了我一个语法错误,声明它无法将varchar值转换为所需的任何内容(错误消息被截断)

    有没有办法在不将整个SQL命令放入字符串并执行它(使用EXEC或sp_executesql)的情况下执行此操作?经过多年避免注入攻击,我对“动态SQL”有一种本能的(也许是非理性的)厌恶

2 个答案:

答案 0 :(得分:0)

把它写到桌子上。

IF EXISTS (SELECT 1 FROM Database.dbo.MyHoldingTable)
DROP TABLE Database.dbo.MyHoldingTable

SELECT <fields>
INTO Database.dbo.MyHoldingTable
FROM <other table>
WHERE <conditions>

然后,后来:

UPDATE OtherTable
Set Column=NewValue
WHERE ID IN (SELECT id FROM Database.dbo.MyHoldingTable)

另请注意,如果您愿意,也可以在桌面上使用INNER JOIN而不是IN子句。

答案 1 :(得分:0)

如果您在SQL Server上的SP之间传递值,我强烈建议将值存储在表格中...
- 临时表(#mytable)
- 表变量(@table)
- 真实表格

在SQL Server 2008及更高版本中,您可以拥有表值输入参数...


如果您从应用程序传递值,则dread逗号分隔字符串确实很有用。 SO上有许多答案,它们提供表值函数,用于将字符串转换为id表,读取即可连接。

SELECT
  *
FROM
  foo
INNER JOIN
  dbo.bar(@mystring) AS bar
    ON foo.id = bar.id