加入后,NVARCHAR显示为“二进制0”

时间:2014-02-13 14:58:45

标签: sql sql-server tsql sql-server-2005-express

我尝试在安装了WSUS数据库的MSSQL 2005 Express服务器上进行搜索。我想获取当前版本的sepcific更新的文件名和摘要值。这是我想要运行的查询:

SELECT 
    * 
FROM 
    tbRevision as rev 
    join tbLocalizedPropertyForRevision as lpfr on lpfr.RevisionID = rev.RevisionID
    join tbLocalizedProperty as lp on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
    join tbFileForRevision as ffr on rev.RevisionID = ffr.RevisionID
WHERE 
    lpfr.LanguageID = 1033 and
    rev.IsLatestRevision = 1 and
    rev.IsBeta = 0 and
    lp.Title like '%931125%';

问题是该查询将找不到任何内容,尽管其中包含该KB编号的修订版。如果我从查询中删除最后一个连接线join tbFileForRevision as ffr on rev.RevisionID = ffr.RevisionID,我会收到所有结果。

想知道出了什么问题我从另一边开始了一个新的查询,知道了文件名:

SELECT
    *   
FROM 
    tbLocalizedPropertyForRevision as lpfr
    join tbRevision as r on r.RevisionID = lpfr.RevisionID
    join tbFileForRevision as ffr on ffr.RevisionID = r.RevisionID
    join tbFile as f on f.FileDigest = ffr.FileDigest   
    join tbLocalizedProperty as lp on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
WHERE
    f.FileName like '%rootsupd%'

在此结果集中,字段Title始终为“二进制0”,DescriptionReleaseNotes始终填充NULL,尽管LocalizedPropertyID已正确填充并匹配来自LocalizedPropertyID

的其他tbLocalizedPropertyForRevisiontbLocalizedPropertyForRevision

我的查询是这样的吗?我做错了什么?如果您需要有关架构的更多详细信息,我很乐意提供它们。

编辑:链接到SUSDB Diagram如果您需要其他格式,请告诉我如何提供它。许多使用Microsoft软件的公司都有WSUS,也许您可​​以自己访问该服务器。

1 个答案:

答案 0 :(得分:1)

在调试多连接查询时,大多数表都是WHERE子句的一部分,这有助于我将查询分解为可以单独测试的部分,如下所示:

SELECT * 
FROM 
    tbRevision as rev 
    left join (
        select *
        from tbLocalizedPropertyForRevision as lpfr
        where lpfr.LanguageID = 1033 
    ) as lpfr 
        on lpfr.RevisionID = rev.RevisionID
    left join (
        select *
        from tbLocalizedProperty as lp
        where lp.Title like '%931125%'
    ) as lp 
        on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
    left join (
        select *
        from tbFileForRevision
    ) as ffr 
        on rev.RevisionID = ffr.RevisionID
WHERE 
    rev.IsLatestRevision = 1 and
    rev.IsBeta = 0

运行上面的内容会给我所有符合rev表标准的记录。 (左连接确保我得到了所有东西。)

然后我可以将联接更改为lpfr回到内部联接,看看我得到了多少记录。

然后我会将该联接更改回left join并添加到最底部的WHERE子句:

and lpfr.LanguageID = Is Null

向我展示我可能不想错过的遗失。

这种方法的优点在于您可以突出显示特定的代码块:

    select *
    from tbLocalizedPropertyForRevision as lpfr
    where lpfr.LanguageID = 1033 

加上你能想到的其他临时调试标准,并单独运行它以查看你得到的记录。

找到问题后,您可以将查询恢复为原始格式,在这种情况下显然需要使用内部联接,以便部署到您的应用中。

由于您比我们更熟悉您的模式和数据,因此这种有条理的分析可能会帮助您更快地得到答案。