Sql server 从select语句进行SQL更新

Sql server 从select语句进行SQL更新,sql-server,select,sql-update,Sql Server,Select,Sql Update,抱歉这么长时间,我试图提供很多信息来避免不相关的解决方案 我的目标是在SELECT语句中嵌入至少一条UPDATE语句,这样我就有机会在SELECT语句运行之前的瞬间更新一些计算值,就像SELECT上的触发器一样。视图不是即时解决方案,因为我受到我正在使用的系统的约束,请参见下文 我正在定制一个功能薄弱的第三方商业ERP系统,该系统将保持无名结果是你没听说过它,但它也不是土生土长的。它有一个固定的查询工具,在这里我可以使用文本/GUI构建一个选择查询。保存查询后,用户可以单击查询执行查询并查看结果

抱歉这么长时间,我试图提供很多信息来避免不相关的解决方案

我的目标是在SELECT语句中嵌入至少一条UPDATE语句,这样我就有机会在SELECT语句运行之前的瞬间更新一些计算值,就像SELECT上的触发器一样。视图不是即时解决方案,因为我受到我正在使用的系统的约束,请参见下文

我正在定制一个功能薄弱的第三方商业ERP系统,该系统将保持无名结果是你没听说过它,但它也不是土生土长的。它有一个固定的查询工具,在这里我可以使用文本/GUI构建一个选择查询。保存查询后,用户可以单击查询执行查询并查看结果。ERP在MS SQL Server 2000上运行;版本升级目前不在考虑之列。我可以在ERP之外用我想要的任何语言编写我需要的任何功能集,如果功能允许的话,我在过去已经这样做了。但是,当我的定制可以在ERP系统中完成时,我的用户社区会发现这更容易

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

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond
GUI生成器帮助新手用户构建字段列表等,但您可以绕过它,以文本形式编写子句,只要SQL在如上组合时有效

我似乎找不到一个咒语来作为SELECT语句的副作用来运行存储过程,不管它是在SELECT子句、where子句中,等等。我真的不在乎如何越狱系统-一个稳定的SQL注入攻击就可以了,只要它不意味着我必须修改底层SQL server本身的安全性。我已经研究过UDF,但是不能将UPDATE语句放入标量UDF中,尝试修改表UDF的返回或执行它是没有意义的?。如果可以从视图中进行更新,那么我希望看到一个示例,但我意识到我可以使用视图来计算列,而这不是我正在寻找的解决方案。我在网上读到一篇关于能够使用某种XP来实现这一点的建议性声明,但至于使用哪种XP或者如何做到这一点,我不知道


这个问题本身并不是一个解决方案:

尝试在存储过程中使用动态sql作为解决方案

链接,使原作者可以得到他/她应得的学分,并希望将有助于你


由于您希望在更新之前选择,您可以修改动态sql,如我发布的链接中所示,首先进行选择。

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

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

存储函数是一个选项吗?您至少可以在MySQL中比在存储过程中更无缝地调用这些函数-而不是调用过程\u NAMEx,您可以只使用选择函数\u NAMEx。

我猜想,对于XP,您可以编写自己的XP来进行更新,并以某种方式将其包含在查询中。我完全不知道这是否有效,以及它应该在查询中的什么位置运行,以便在SQL查看您的数据之前运行


听起来你已经尝试了我想尝试的一切。我很同情您,因为在运行select之后,更新状态可能会很容易。

我想不出任何方法将select与SQL 2000中的更新结合起来,尽管在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,并且所需的数据将位于第二个集中。根据这三个值的使用方式和错误捕获方式,可能还有其他解决方法。让第一个查询生成错误,并希望更新和第二个查询通过?

FYI其他研究表明,CLR函数可能会使我达到目的,但SQL 2000中没有CLR函数。