测试列,失去理智

时间:2013-11-22 10:39:07

标签: sql-server tsql

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引擎评估所有表达式,无论它们是否正在发生!永远不要忘记逻辑!

我高吗?困惑?傻?

对于全部大写,很抱歉,对此非常感到沮丧。

3 个答案:

答案 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'