T-SQL - 比较列值和列名称

时间:2016-10-18 10:49:06

标签: tsql

我试图从一个小表中获取值,这些值不作为现有表中的列存在。

以下是我在SQL Server 2012中尝试过的一些代码:

BEGIN TRAN;
GO
CREATE TABLE [dbo].[TestValues](
    [IdValue] [int] IDENTITY(1,1) NOT NULL,
    [Code] [nvarchar](100) NULL,
) ON [PRIMARY];
GO
CREATE TABLE [dbo].[TestColumns](
    [DateHour] [datetime2](7) NULL,
    [test1] [nvarchar](100) NULL,
    [test2] [nvarchar](100) NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[TestValues] ([Code])
VALUES
    (N'test1')
    , (N'test2')
    , (N'test3')
;
GO
SELECT
    v.[Code]
    , c.[name]
FROM
    [dbo].[TestValues] AS v
    LEFT OUTER JOIN [sys].[columns] AS c ON v.[Code] = c.[name]
WHERE
    (c.[object_id] = OBJECT_ID(N'[dbo].[TestColumns]'))
    AND (c.[column_id] > 1)
;
WITH
cteColumns AS (
    SELECT
        c.[name]
    FROM
        [sys].[columns] AS c
    WHERE
        (c.[object_id] = OBJECT_ID(N'[dbo].[TestColumns]'))
        AND (c.[column_id] > 1)
)
SELECT
    v.[Code]
    , c.[name]
FROM
    [dbo].[TestValues] AS v
    LEFT OUTER JOIN cteColumns AS c ON v.[Code] = c.[name]
;
GO
ROLLBACK TRAN;
GO

在我看来,两个选择应该具有相同的输出。有人可以提供解释吗?

TestValues是一个接收数据的表。 TestColumns是在项目启动时通过持久化PIVOT查询创建的表。最近插入TestValues的过程收到了一些新数据。我尝试使用第一个查询获取新值,当结果没有显示任何新内容时,我感到很惊讶。

编辑1:谢谢院长的回答,这听起来是一个很好的解释。您是否有任何描述未选择表格行为的官方页面?我做了一个快速的谷歌搜索,我得到的只是链接到甲骨文。 (作为编辑添加,因为我没有足够的声誉点来评论)

0 个答案:

没有答案