【发布时间】:2011-10-05 09:50:24
【问题描述】:
我正在使用 MS SQL Server 2005,并尝试编写一个两步流程的脚本:
- 在表中查询符合特定条件的 ID 列表
- 更新该表中的字段,其中 ID 位于第一个返回的 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”有些本能(也许是非理性的)厌恶
【问题讨论】:
-
这是可行的,但解决方案要么是丑陋的黑客,要么太复杂。上周我在搜索这个时发现了一些关于 SO 的解释。
-
您使用的语法无效,但是在将 CSV 数据传递到存储过程时可以使用一些技术。请注意,他们中的大多数人相当丑陋,但他们确实完成了工作。
-
@Kragen - 这不是骗子,因为他的要求是让列表在不同的过程/会话之间传递。
-
克拉根说得对,这个问题已经足够接近回答我的问题了。这不是完全相同的场景,但我需要将第一步的结果以可以存储在 SQL 之外的格式(例如在应用程序中的字符串或结果集中)然后传递回#2(这限制了我稍后会使用字符串/varchar)。我可能应该在问题中明确说明该要求,我很抱歉没有这样做,并感谢所有回复的人......现在我如何将其标记为已回答/重复?
标签: sql sql-server-2005 criteria dynamic-sql