use*_*582 6 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
Run Code Online (Sandbox Code Playgroud)
GUI构建器可以帮助新手用户构建fieldList等等,但只要SQL在上面组合时有效,就可以绕过它并在文本中编写子句.
我似乎无法找到一个咒语来运行存储过程作为SELECT语句的副作用,无论是在select子句,where子句等等.我真的不在乎我如何越狱系统 - 一个稳定的SQL注入攻击会很好,只要它并不意味着我必须修改底层sql server本身的安全性.我查看了UDF,但是你不能将UPDATE语句放入标量UDF中,尝试修改表UDF的返回是没有意义的(或者它是什么?).如果你可以在VIEW中更新,那么我想看一个例子,但我意识到我可以使用VIEW来计算列,这不是我正在寻找的解决方案.我在网上阅读了一篇关于能够使用某种XP_来实现这一目标的建议性声明,但至于哪个XP_或如何做,我不知道.
这个问题本身并不是解决方案:在select语句中更新表
我想不出在 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'"
Run Code Online (Sandbox Code Playgroud)
[分号实际上是可选的,甚至可能在 SQL 2000 中不起作用——它们只是清楚地表明一个命令在哪里结束,下一个命令在哪里开始。]
这样做的缺点是您将返回两个数据集。第一个将是一个空的单列集(如果您想要为列命名,则别名为 NULL),并且您想要的数据将位于第二个集中。可能还有其他解决方法,具体取决于如何使用这三个值以及如何捕获错误。(让第一个查询生成并出错,并希望更新和第二个查询能够通过?)