IF ((SELECT count(name) FROM syscolumns WHERE name = 'foobar') > 0)
BEGIN
SELECT 'exists'
--, foobar FROM baz -- <--rename this to a table that exists
END
ELSE
SELECT 'boo'
IF (exists(SELECT name FROM syscolumns WHERE name = 'foobar'))
BEGIN
SELECT 'exists'
--, foobar FROM baz -- <--rename this to a table that exists
END
ELSE
SELECT 'boo'
这两个语句都应该为你生成'boo'(对任何db运行')。
UNCOMMENT每个查询中的第二个SELECT值(foobar)......
据我所知,@!%$ ing引擎评估所有表达式,无论它们是否正在发生!永远不要忘记逻辑!
我高吗?困惑?傻?
对于全部大写,很抱歉,对此非常感到沮丧。
答案 0 :(得分:1)
我无法理解问题所在。如果数据库引擎告诉你:
Msg 207, Level 16, State 1, Line 4
Invalid column name 'foobar'.
Msg 207, Level 16, State 1, Line 12
Invalid column name 'foobar'.
那就是预期的行为。听说过运行时/编译时错误?
尝试将列更改为存在的内容,它将正常工作。问题是,即使逻辑是这个代码块永远不会执行,仍然在编译SQL时,数据库引擎会评估并确定该列不存在。因此错误。
答案 1 :(得分:1)
使用EXEC
怎么样?
并COL_LENGTH
找到列的存在,因为它比检查syscolumns IMO要好得多。
IF COL_LENGTH('foobar','foo') IS NOT NULL
BEGIN
EXEC ('SELECT ''exists''
, foo FROM foobar') -- <--rename this to a table that exists
END
ELSE
SELECT 'boo'
答案 2 :(得分:0)
经过10分钟的挫折,我终于明白了。虽然我不能100%确定是否允许您指定不存在的列,但可能有以下解决方法:
IF ((SELECT count(name) FROM syscolumns WHERE name= 'foobar') > 0)
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N' SELECT foobar FROM #temp1 -- <--rename this to a table that exists;';
EXEC sp_executesql @sql;
END
ELSE
SELECT 'boo'