0

我有一个带有用户表的数据库。我想用 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 行“合并”附近的语法不正确。

我究竟做错了什么?

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

更新:

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

感谢大家!

4

3 回答 3

1

我的建议是:

  1. 在合并表达式的末尾添加分号
  2. 请检查 ACTIVE 字段是否 = 定义为 INT。如果是 TINYINT,请显式地投射 1
于 2013-03-06T14:47:59.360 回答
1

放一个; 合并后。

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

于 2013-03-06T14:42:42.137 回答
0

在与 SQL 服务器的合并语句中,您需要用;分号结束它

在此处检查语法MSDN

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);
于 2013-03-06T14:53:42.927 回答