select语句中的SQL更新

时间:2009-06-29 18:23:00

标签: sql-server select sql-update

对不起这个问题的长度,我试图提供大量信息以避免不相关的解决方案。

我的目标是在SELECT语句中嵌入至少1个UPDATE语句,这样我就有机会在select语句运行之前的瞬间更新一些计算值(想象它就像SELECT上的TRIGGER一样)。 VIEW不是立竿见影的解决方案,因为我受到我正在使用的系统的限制(见下文)。

我正在定制一个功能薄弱的第三方商业ERP(系统将保持无名! - 结果是你没有听说过它,但它还没有成熟)。它有一个预制查询工具,我可以使用文本/ GUI来构建SELECT查询。保存查询后,用户可以单击查询以执行查询并查看结果。 ERP在MS SQL Server 2000上运行;版本升级现在不在卡片中。我可以用我想要的任何语言在ERP之外编写我需要的任何功能集,如果功能需要的话,我过去就已经这样做了。但是,当我的自定义可以在ERP系统中完成时,我的用户社区会发现它更容易。

查询可以是任意复杂的,但ERP包本身构建SQL Select语句。编译后的ERP内部就是这样的(这只是猜测!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

GUI构建器可以帮助新手用户构建fieldList等等,但是只要SQL在上面合并时有效,就可以绕过它并在文本中编写子句。

我似乎找不到运行存储过程作为SELECT语句的副作用的咒语,无论是在select子句,where子句等等。我真的不在乎我如何越狱系统 - - 一个稳定的SQL注入攻击就可以了,只要它并不意味着我必须修改底层sql server本身的安全性。我查看了UDF,但是你不能将UPDATE语句放入标量UDF中,尝试修改表UDF的返回是没有意义的(或者是吗?)。如果你可以在VIEW中更新,那么我想看一个例子,但我意识到我可以使用VIEW来计算列,这不是我想要的解决方案。我在网上阅读了一篇关于能够使用某种XP_来实现这一目标的建议性声明,但至于哪个XP_或如何做,我不知道。

这个问题本身并不是解决方案:Updating a table within a select statement

5 个答案:

答案 0 :(得分:1)

我想不出在SQL 2000中将SELECT与UPDATE结合的任何方法(尽管在2005及以后,OUTPUT子句可用)。但是,看起来你得到三个字符串值(fieldList,tableListAndJoins,whereCond)与“SELECT”,“FROM”和“WHERE”连接在一起,并假设他们没有做一些严重的SQL注入类似代码检测,你可以把这样的东西拼凑起来:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[分号实际上是可选的,甚至可能在SQL 2000中不起作用 - 它们只是清楚地表明一个命令结束而下一个命令的开始。]

这样做的缺点是你将获得两个数据集。第一个是空的单列集(如果你想要列的名称,别名为NULL),你想要的数据将在第二个集合中。其他解决方法也许是可行的,具体取决于如何使用这三个值以及如何捕获错误。 (让第一个查询生成并出错,并希望更新和第二个查询通过?)

答案 1 :(得分:0)

尝试在存储过程中使用动态sql stated on the last reply here

链接,以便原作者可以获得他/她应得的学分,并希望对您有所帮助。

由于你想在UPDATE之前选择SELECT,你可以像我发布的链接一样修改动态sql,先进行SELECT。

答案 2 :(得分:0)

我不确定我是否理解你情况的限制,但你不能一次只运行两个语句,例如:

string sql = "update MyTable set x=y;select x from MyTable;";

答案 3 :(得分:0)

存储的功能是否可以选择?您可以比存储过程更无缝地调用(至少在MySQL中) - 而不是“调用PROCEDURE_NAME(x)”,您只需使用“SELECT FUNCTION_NAME(x)”。

答案 4 :(得分:0)

我对XP的猜测是你会编写自己的XP进行更新并以某种方式将其包含在查询中。无论这是否有效以及在查询中应该在SQL查看数据之前运行的位置都完全超出我的范围。

听起来你已经尝试过我会尝试的一切。我觉得你,因为在运行select之后更新状态可能相当容易。