【问题标题】:why does sql server execute the second statement redundantly?为什么sql server会冗余执行第二条语句?
【发布时间】:2014-08-23 20:57:45
【问题描述】:
如果表 Tru.Repo 不存在,我会抛出以下错误:
IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tru' AND TABLE_NAME = 'Repo')) OR
(NOT EXISTS (SELECT * FROM Tru.Repo WHERE RepoName = 'Tru.Repo'))
BEGIN
print('in')
END
但我希望如果 Tru.Repo 不存在,那么第一个语句是正确的,那么为什么它会执行第二个语句?有没有办法使用单个 IF 块解决这个问题?
【问题讨论】:
标签:
sql-server
sql-server-2014
【解决方案1】:
T-SQL 被解释,所以它首先要确保一切都是有效的。您可以使用动态 SQL 来解决它,但这很麻烦。
【解决方案2】:
问题不在于第二条语句被执行。 “问题”是整个语句是在运行之前编译的。
所以,第二条语句被编译。而且,当表不存在时会出现编译错误。
以下是解决此问题的方法:
IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tru' AND TABLE_NAME = 'Repo'))
BEGIN
print('in')
END
ELSE
BEGIN
declare @retval int = 0;
exec sp_execute_sql N'SELECT @retval = 1 FROM Tru.Repo WHERE RepoName = ''Tru.Repo''',
N'@retval int output', @retval = @retval;
if @retval = 0
BEGIN
print('in')
END
END;