如果表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块解决这个问题?
答案 0 :(得分:2)
解释T-SQL,因此它首先要确保所有内容都有效。您可以使用动态SQL解决它,但这非常混乱。
答案 1 :(得分:1)
问题不在于第二个语句是已执行。 "问题"是整个语句在运行之前编译。
所以,编译第二个语句。并且,当表格不存在时,您会收到编译错误。
以下是解决此问题的方法:
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;