【问题标题】:Table Merge with sql server 2008使用 sql server 2008 进行表合并
【发布时间】:2013-03-06 14:38:57
【问题描述】:

我有一个带有用户表的数据库。我想用 csv 文件更新所有用户。我使用 SqlBulkCopy 将我的 csv 文件导入到一个临时表中。

我的下一步是创建一个使用临时表更新我的用户表的存储过程。到目前为止,我有这个:

USE [Userdata]
GO
/****** Object:  StoredProcedure [dbo].[aml_UserImport]    Script Date: 03/06/2013 14:11:44 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
-- =============================================
-- Author:      michiel reyers
-- Create date: 07-01-2013
-- Description: 
-- =============================================
CREATE PROCEDURE [dbo].[aml_UserImport2]

AS

    SET NOCOUNT ON;

    MERGE users
        USING temp_users ON temp_users.ID = users.ID
        WHEN MATCHED 
            THEN UPDATE SET users.typeId = temp_users.typeId,
                                users.Name = temp_users.Name,
                                users.active = 1
        WHEN NOT MATCHED BY SOURCE
            THEN UPDATE SET users.active = 0
        WHEN NOT MATCHED BY TARGET
            THEN Insert (ID,typeID,Name,active) 
            VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1)
    ;

当我尝试执行此操作时,我收到错误:

消息 102,级别 15,状态 1,过程 aml_UserImport2,第 13 行 'MERGE' 附近的语法不正确。

我做错了什么?

我添加了半列,但仍然没有运气:-(

更新:

我进行了重新检查,尽管我使用的是 MS SQL Server Management 2008 R2。看来我的数据库具有 SQL Server 2005 (90) 的兼容性级别。这可能解释了为什么这不起作用....

谢谢大家!

【问题讨论】:

  • Gareth,没有更多,但我添加了所有代码...
  • 我有点不知所措,因为该程序在我的本地计算机(2008 和 2012 年)以及 SQL Fiddle 上运行没有错误。
  • Gareth 非常感谢您验证我的代码。我进行了重新检查,尽管我使用的是 MS SQL Server Management 2008 R2。看来我的数据库具有 SQL Server 2005 (90) 的兼容性级别。这可能解释了为什么这不起作用....

标签: sql sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

我的建议是:

  1. 在合并表达式末尾添加分号
  2. 请检查 ACTIVE 字段是否 = 定义为 INT。如果是 TINYINT,请显式转换 1

【讨论】:

    【解决方案2】:

    放一个;合并后。

    MERGE 语句需要分号 (;) 作为语句终止符。在没有终止符的情况下运行 MERGE 语句时会引发错误 10713。(来自 MSDN)

    【讨论】:

    • 我的合并前面有以下语句:SET NOCOUNT ON;那个半列应该做对了吗?
    【解决方案3】:

    在与 SQL server 的 Merge 语句中,您需要以 ; 分号结束它

    Check Syntax hereMSDN

    MERGE users
        USING temp_users ON temp_users.ID = users.ID
        WHEN MATCHED 
            THEN UPDATE SET users.typeId = temp_users.typeId,
                            users.Name = temp_users.Name,
                            users.active = 1
        WHEN NOT MATCHED BY SOURCE
            THEN UPDATE SET users.active = 0
        WHEN NOT MATCHED BY TARGET
            THEN Insert (ID,typeID,Name,active) 
                VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2011-10-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多