我正在使用SQL 2005,并且具有以下代码:
DECLARE @exist4 INT
IF ( SELECT COUNT(*) existe
FROM sysobjects obj
WHERE obj.name = 'table4'
) > 0
BEGIN
SET @exist4 = 1
END
ELSE
BEGIN
SET @exist4 = 0
END
/*now if table4 exist i need add to my query but if i do something as it
i got next error
Invalid object name 'table4'.*/
IF ( @exist4 = 0 )
BEGIN
SELECT [table].col1 ,
[table].col2 ,
[table].col3 ,
[table].colN
FROM [table] ,
table2 ,
table3
WHERE [table].id = table1.id
AND table3.id = table2.id
END
ELSE
BEGIN
SELECT [table].col1 ,
[table].col2 ,
[table].col3 ,
[table].colN
FROM [table] ,
table2 ,
table3 ,
table4
WHERE [table].id = table2.id
AND table3.id = table2.id
AND table4.id = table3.id
END
当Table4不存在时,此代码返回错误。如何才能使此查询生效?
答案 0 :(得分:0)
发生的事情是在解析查询时table4不存在。这意味着您无法运行查询。
您需要做的是延迟解析该部分查询,直到您知道table4存在。
您可以通过将查询放在字符串中然后运行存储过程sp_excutesql来完成此操作。像这样:
DECLARE @myQueryString NVARCHAR(4000);
SET @myQueryString = N'select table.col1, table.col2, table.col3, table.colN into #tmp
from table,table2,table3,table4
where table.id=table2.table1id
and table3.table2id=table2.id
and table4.table3id=table3id';
EXEC sp_executesql @myQueryString;
引用table4的查询部分仅在第一次解析整个查询时才可用作字符串,因此解析器只能看到一个字符串,而不是对各个表的引用。运行sp_executesql时,将解析并运行该字符串。因为你将它放在你的IF块中,它只会在知道table4存在时解析并运行。
答案 1 :(得分:0)
优化器可能正在尝试评估select语句语法,因此请将其包装在sp_executesql语句中以延迟该语法。尝试:
IF ( SELECT OBJECT_ID('SQLInstances')
) IS NOT NULL
BEGIN
EXEC sp_executesql @statement = N'select table1.col1, table1.col2, table1.col3, table1.colN into #tmp from table1,table2,table3
where table1.id=table2.table1id
and table3.table2id=table2.id'
END
ELSE
BEGIN
EXEC sp_executesql @statement = N'select table1.col1, table1.col2, table1.col3, table1.colN into #tmp from table1,table2,table3,table4
where table1.id=table2.table1id
and table3.table2id=table2.id
and table4.table3id=table3id'
END