我正在使用MS SQL Server 2005,并试图基本编写一个两步过程:
抓住的是,步骤1和2可能会分开相当长的时间并在不同的会话中执行。 #2中使用的ID列表必不可少的是历史数据:#1在过去的时间点返回的值。
我试图将#1中的所有ID写入varchar(8000)中的“##,##,##,##,”格式(此部分工作正常),然后使用该字符串,如:
UPDATE table SET field=newValue WHERE (id IN (@varcharOfCommaSeparatedIDs))
但是这给了我一个语法错误,声明它无法将varchar值转换为所需的任何内容(错误消息被截断)
有没有办法在不将整个SQL命令放入字符串并执行它(使用EXEC或sp_executesql)的情况下执行此操作?经过多年避免注入攻击,我对“动态SQL”有一种本能的(也许是非理性的)厌恶
答案 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