对不起,这个长度,我试图给了很多信息,以避免不相关的解决方案。

我的目标是嵌入至少1 UPDATE语句为SELECT语句,使我有机会select语句运行之前更新的瞬间一些计算值(认为它像选择触发)。 VIEW不是立即解决,因为我通过我使用(见下文)。

的系统约束

我定制的第三方商用ERP是在功能弱(系统将继续无名 - 结果是你有没有听说过它,但它不是土生土长的,要么)。它有一个固定的查询工具,我可以使用文本/ GUI构建一个SELECT查询。有一次,我保存查询,用户可以在查询点击执行它并查看结果。 ERP之上运行的MS SQL Server 2000;版本升级是不是在卡现在。我能写什么功能集,我需要在我想要的任何语言的ERP之外,我在过去做到了这一点,如果功能保证它。但我的用户社区发现它很容易,当我的自定义可以在ERP系统来完成。

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

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

在GUI构建器可以帮助新手用户建立字段列表等等,但你可以绕过它,只要如上结合时的SQL是有效的写在文本中的条款。

我似乎无法找到一个咒语,运行存储过程作为SELECT语句的副作用,无论是在SELECT子句,where子句等,我真的不在乎我怎么越狱的系统 - - 稳定的SQL注入攻击就可以了,只要这并不意味着我不得不修改基础SQL服务器本身的安全性。我看过的UDF,但你不能把一个UPDATE语句成标量UDF,它没有任何意义,试图修改表UDF的回报(或不是吗?)。如果你可以从视图内更新,然后我想看到一个例子,但是我知道我可以使用视图来计算列,这是不是我要找的解决方案。我在网上看了一个提示语句对能够使用某种XP_的做到这一点,但哪个XP_或如何做到这一点,我不知道。

此问题是不是一个解决方案,在其本身和:更新一个表选择语句

有帮助吗?

解决方案

我想不出任何办法的选择组合,在SQL 2000(虽然在2005年时,输出条款可用)的更新。然而,它看起来像你得到得到与“选择”一起串联三个字符串值(fieldList中,tableListAndJoins,whereCond)“从”和“WHERE”,并假设他们没有做一些严重的SQL injenction类代码检测,你也许能够杂牌起来是这样的:

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

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[分号实际上是可选的,甚至可能没有在SQL 2000的工作 - 他们只是说清楚其中一个命令结束和下一个开始]

这种方法的缺点是,你会得到两个数据集。第一个会是你想要将在第二盘空单柱集(别名,如果你想一个名字列NULL),和数据。其他变通办法是可能的,这取决于这三个值是如何使用和错误是如何捕获。 (我们首先查询生成和错误,并希望更新和第二查询办理什么手续?)

其他提示

尝试在存储过程作为此处上的最后一个答复说使用动态SQL

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

既然你想要的UPDATE之前选择,你可以修改动态SQL中我发布的链接,先做SELECT。

我不知道我理解你的处境的限制,但你能不能只运行一次两个语句,如:

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

会存储函数是一种选择?您可以(至少在MySQL),比存储过程更无缝地调用这些 - 而不是“call过程(X)”你可以用“SELECT FUNCTION_NAME(X)”

我用XP的猜测是,你会写自己的XP做了更新,它包括在查询莫名其妙。不管是不是会工作,并在那里查询它应该使SQL之前看你的数据是完全超出我来运行。

这听起来像你尝试过一切,我会尝试。我对你的感觉,因为它很可能是相当容易更新状态的之后的你跑的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top