Sql server SQL查询,列应存在,但结果表明不存在

Sql server SQL查询,列应存在,但结果表明不存在,sql-server,tsql,Sql Server,Tsql,我很难理解为什么这个查询告诉我找不到TaxPayerID,而在一开始,我清楚地检查它,并且只使用数据库,数据库应该包含nTrucks表中的TaxPayerID列 sp_MSforeachdb ' IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''nTrucks'' AND COLUMN_NAME = ''TaxPayerID'') BEGIN SELECT "?", nTrucks

我很难理解为什么这个查询告诉我找不到TaxPayerID,而在一开始,我清楚地检查它,并且只使用数据库,数据库应该包含nTrucks表中的TaxPayerID列

sp_MSforeachdb 
'
IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''nTrucks'' AND COLUMN_NAME = ''TaxPayerID'')

BEGIN
    SELECT "?", nTrucks.UnitNumber, ntrucks.Companyid, nCompanyData.CompanyName, nTrucks.Owner, nTrucks.TaxPayerID
    FROM nTrucks
    INNER JOIN nCompanyData ON nTrucks.CompanyID = nCompanyData.CompanyID
    WHERE nTrucks.Owner like ''%Trucker%''
END
'
我收到多个“无效列名”“TaxPayerID.”错误,我假设它来自不包含此列的数据库

如果这里有人能扔给我一根骨头,一句简单的“你是个傻瓜,这样做吧!”,我会非常感激的

JF

你是个笨蛋!(你自找的):)

如何调试此错误:

找到引发错误的数据库,并尝试直接对其执行实际的SQL查询,以查看它是否将编译:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''nTrucks'' AND COLUMN_NAME = ''TaxPayerID'')

BEGIN
    SELECT nTrucks.UnitNumber, ntrucks.Companyid, nCompanyData.CompanyName, nTrucks.Owner, nTrucks.TaxPayerID
    FROM nTrucks
    INNER JOIN nCompanyData ON nTrucks.CompanyID = nCompanyData.CompanyID
    WHERE nTrucks.Owner like ''%Trucker%''
END
它将失败

现在您知道SQLServer在查询解析时而不是运行时检查模式。 然后按照@GordonLinoff的建议,将
SELECT
查询转换为动态SQL,如下所示:

sp_MSforeachdb 
'

IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''nTrucks'' AND COLUMN_NAME = ''TaxPayerID'')

BEGIN
    EXEC( 
    ''SELECT "?", nTrucks.UnitNumber, ntrucks.Companyid, nCompanyData.CompanyName, nTrucks.Owner, nTrucks.TaxPayerID
    FROM [?]..nTrucks
    INNER JOIN [?]..nCompanyData ON nTrucks.CompanyID = nCompanyData.CompanyID
    WHERE nTrucks.Owner like ''''%Trucker%''''
    '' )
END

'
(我希望我的报价是正确的)


如果您的查询应该引用一个中心nCompareData表,那么在nCompareData之前删除
[?]…
,我认为您需要在动态SQL中使用动态SQL。您有一个编译错误,这发生在运行
if
逻辑之前。如果我在开始后取出行上的nTrucks.TaxPayerID,它就会运行。这就是我被难住的原因。您的第二个语句需要从
[?]…nTrucks
中进行选择,而不仅仅是
nTrucks
sp_MSforeachdb
不会自动更改数据库。@GordonLinoff谢谢!我不知道该怎么做。但是今晚我学到了很多
sp_MSforeachdb
不会自动更改当前数据库。我相信问题出在nTrucks的
中。它应该是来自[?]…nTrucks的
@Nick.McDermaid-我当然是dummy@Nick.McDermaid,您没有错,我测试了EXEC sp_MSforeachdb'SELECT DB_NAME()'
-多次返回相同的值您可以更改答案以反映这一点吗?我宁愿有一个正确的答案,也不愿自己写出来。事实上,我很确定这可能已经在某个地方得到了回答+我确实要求过。你们是最棒的!上述措施实际起了作用;)非常感谢。我开始觉得我疯了!