【问题标题】:SQL Server: Merge statement compilation errorSQL Server:合并语句编译错误
【发布时间】:2016-01-07 08:40:44
【问题描述】:

我在存储过程中使用了 SQL Server MERGE 语句,在编译存储过程时出现此错误:

对象引用 [dbo].[Student].[ID] 仅大小写不同 对象定义 [dbo].[Student].[Id].

我的表结构是:

CREATE TABLE [dbo].[Student] 
(
    [Id]        INT          NOT NULL,
    [FirstName] VARCHAR (50) NULL,
    [LastName]  VARCHAR (50) NULL,
    [StateID]   INT          NULL,
    [CityID]    INT          NULL,
    [IsActive]  BIT          NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
)

我的存储过程是:

CREATE PROCEDURE [dbo].USP_UpdateStudent
AS
    Declare @Data xml  

    SET @Data = '<?xml version="1.0" encoding="utf-16"?>
                 <Students>  
                    <Student>    
                       <ID>2</ID>    
                       <FirstName>Tridip</FirstName>    
                       <LastName>Bhattacharjee</LastName>    
                       <IsActive>true</IsActive>    
                       <StateID>2</StateID>    
                       <CityID>4</CityID>  
                    </Student>
                 </Students>'  
    BEGIN TRY
        MERGE INTO Student as Trg  
        USING (SELECT
                   d.x.value('id[1]', 'varchar(MAX)') as ID,
                   d.x.value('FirstName[1]', 'varchar(MAX)') as FirstName ,  
                   d.x.value('LastName[1]', 'varchar(MAX)') as LastName,
                   d.x.value('StateID[1]','int') as StateID,
                   d.x.value('CityID[1]','int') as CityID,
                   d.x.value('IsActive[1]','bit') as IsActive
               FROM
                   @data.nodes('/Students/Student') as  d(x)) AS Src ON Trg.ID = Src.ID  

        WHEN MATCHED THEN
            UPDATE 
            SET Trg.FirstName = Src.FirstName,  
                Trg.LastName = Src.LastName,
                Trg.StateID = Src.StateID,
                Trg.CityID = Src.CityID,
                Trg.IsActive = Src.IsActive

        WHEN NOT MATCHED BY TARGET THEN
            INSERT (FirstName, LastName, StateID, CityID, IsActive) 
            VALUES(Src.FirstName, Src.LastName, Src.StateID, Src.CityID, Src.IsActive);   
    END TRY
    BEGIN CATCH
      -- Insert Error into table
      --INSERT INTO #error_log(message)
      --VALUES (ERROR_MESSAGE());
    END CATCH

我的错误是什么导致了这个错误?谢谢

编辑

获得了 2 个通过 SSMS 和 LinqPad 连接 sql compact db 的良好链接。这是链接

https://stackoverflow.com/a/16692386/728750 https://dba.stackexchange.com/questions/47534/how-do-i-view-a-microsoft-sql-server-compact-database

谢谢

【问题讨论】:

  • 那么,如果你使列名的大小写一致(即在任何地方都使用“Id”而不是像Trg.ID 那样混合使用“Id”和“ID”)会发生什么? ) (另外,这是错误还是警告?大概这是来自您的客户端工具而不是服务器?想想可能是an option not to bother checking...)
  • 我相信这是一个 SSDT 警告(所以,一个你没有提到的工具,一个警告,而不是一个错误),对吗?
  • 我正在使用来自 VS2013 IDE 的 Sql server compact db 并在那里编写 store proc。
  • 感谢我将学生表中的列名从 ID 更改为 ID 的那一刻解决了问题。谢谢
  • 我正在使用 VS2013 并从 IDE 打开紧凑型数据库。所以告诉我应该打开/关闭什么选项来摆脱这个区分大小写的问题。分享想法。谢谢

标签: sql-server stored-procedures sql-merge


【解决方案1】:

如果您不关心 SQL 中的大小写设置,则可以通过取消选中“验证标识符的大小写”框来禁用项目设置中的此警告

【讨论】:

    【解决方案2】:

    这本身不是 SQL Server 错误,只是来自您的开发工具的警告。它告诉您您与对象名称的大小写不一致,在这种情况下混合和匹配 IdID(注意小写“d”)。

    在大多数使用 SQL Server 的情况下,这实际上并不重要,您的 SQL 仍会运行;根据我的经验,大多数安装都不区分大小写。但是保持一致通常是一件好事,并且可能会防止将来出现问题,所以我只是修复您的代码,以便您始终如一地使用在表定义中声明的列名。

    【讨论】:

    • 我正在使用 VS2013 并从 IDE 打开紧凑型数据库。所以告诉我应该打开/关闭什么选项来摆脱这个区分大小写的问题。分享想法。谢谢
    • 这个错误实际上来自什么工具?如果是 SSDT,你check the article I provided in my comment 看看是否适用?
    • (或者可能:项目属性->构建->抑制 Transact-SQL 警告,并添加 71558,假设这是您看到的警告编号。我真的不确定,因为我不知道t 使用 Visual Studio 与 SQL Server 交互。)
    • 我们可以从 sql server management studio 打开 compact db 吗?任何想法
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2011-02-08
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多