我有一个SQL脚本,每次客户端执行"数据库管理"功能时都必须运行该脚本.该脚本包括在客户端数据库上创建存储过程.其中一些客户端在运行脚本时可能已经有了存储过程,有些可能没有.我需要将缺少的存储过程添加到客户端数据库中,但是我尝试弯曲T-SQL语法并不重要,我得到了
CREATE/ALTER PROCEDURE'必须是查询批处理中的第一个语句
在创作作品之前我已经读到了它,但我不喜欢这样做.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Run Code Online (Sandbox Code Playgroud)
如何添加检查存储过程是否存在并创建它(如果它不存在)但如果存在则更改它?
当我尝试计算没有select语句指定的varchar值的行数时,我遇到了一个奇怪的情况.好吧,这对我来说听起来很混乱,所以让我举个例子:
假设我在"SomeTable"中有一个字段"MyField",我想要计算MyField值不属于"SomeOtherTable"中"MyOtherField"值定义的域的行数.换句话说,假设我有MyOtherField = {1,2,3},我想要计算MyField值不是1,2或3的行数.为此,我将使用以下查询:
SELECT COUNT(*) FROM SomeTable
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable))
Run Code Online (Sandbox Code Playgroud)
它就像一个魅力.但请注意,MyField和MyOtherField是int类型.如果我尝试运行完全相同的查询,除了varchar类型的字段,它的返回值是0,即使我知道有错误的值,我把它们放在那里!然而,如果我只是通过在上面的查询中抑制"NOT"子句来尝试计算相反的数量(域中有多少行与我想要的行数相反,那是多少行不是)...嗯,这就是作品!¬¬
是的,必须有大量的解决方法,但我想知道为什么它不会按照应有的方式工作.此外,我不能简单地改变整个查询,因为大部分内容是在C#代码中构建的,基本上我唯一可以自由更改的部分对软件的任何其他部分都没有影响的是select语句对应于域(NOT IN子句中的任何内容).我希望我能说清楚,有人可以帮助我.
提前致谢.