Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2014-合并-语法错误_Sql Server_Database_Tsql_Merge_Syntax Error - Fatal编程技术网

Sql server SQL Server 2014-合并-语法错误

Sql server SQL Server 2014-合并-语法错误,sql-server,database,tsql,merge,syntax-error,Sql Server,Database,Tsql,Merge,Syntax Error,我使用SQL Server中的foreachdb将此查询与merge语句作为较大脚本的一部分运行。我不断地收到随机语法错误- Msg 156, Level 15, State 1, Line 59 Incorrect syntax near the keyword 'AS'. Msg 102, Level 15, State 1, Line 72 Incorrect syntax near ')'. 我的剧本怎么了?当合并在foreachdb之外运行时,它运行良好,没有任何错误。在foreac

我使用SQL Server中的foreachdb将此查询与merge语句作为较大脚本的一部分运行。我不断地收到随机语法错误-

Msg 156, Level 15, State 1, Line 59
Incorrect syntax near the keyword 'AS'.
Msg 102, Level 15, State 1, Line 72
Incorrect syntax near ')'.
我的剧本怎么了?当合并在foreachdb之外运行时,它运行良好,没有任何错误。在foreachdb内部时,每次都会出现不同的错误

USE RedshiftDatabase;


EXEC sp_MSforeachdb
'

BEGIN
USE ?;

        TRUNCATE TABLE #UnMatchedTransactions


        PRINT(''truncate complete'');


        INSERT INTO #UnMatchedTransactions
        SELECT
            DB_NAME(),
            TxnID,
            BatchID,
            DateCreated,
            CURRENT_TIMESTAMP,
            CURRENT_TIMESTAMP,
            0
        FROM
            UnMatchedTransactions;

        SELECT db_name(),''done'';
        SELECT ClientName, COUNT(1) FROM #UnMatchedTransactions GROUP BY ClientName;

        CHECKPOINT;

        BEGIN TRANSACTION merge_tran


                MERGE INTO RedshiftDatabase.dbo.UnMatchedTransactions AS TARGET
                USING  #UnMatchedTransactions AS SOURCE
                ON  
                (
                    TARGET.ClientName = SOURCE.ClientName 
                AND 
                    TARGET.TxnID = SOURCE.TxnID
                AND 
                    TARGET.BatchID = SOURCE.BatchID
                )
                WHEN MATCHED AND (TARGET.DateCreated <> SOURCE.DateCreated)
                THEN
                    UPDATE SET 
                        DateCreated  = SOURCE.DateCreated, 
                        UpdatedTS = CURRENT_TIMESTAMP
                WHEN NOT MATCHED BY TARGET
                THEN
                INSERT ( ClientName,
                        TxnID,
                        BatchID,
                        DateCreated
                        ) 
                VALUES (SOURCE.ClientName,
                        SOURCE.TxnID,
                        SOURCE.BatchID,
                        SOURCE.DateCreated
                        )
                WHEN NOT MATCHED BY SOURCE 
                THEN 
                    UPDATE SET 
                            TARGET.IsDeleted = 1,
                            TARGET.UpdatedTS = CURRENT_TIMESTAMP
                ;

        END TRANSACTION merge_tran;

        CHECKPOINT;

        SELECT db_name(),''Mergedone'';
        SELECT BL_ClientName, COUNT(1) FROM RedshiftDatabase.dbo.UnMatchedTransactions GROUP BY ClientName;

    END;
END
'

下面是对代码的一些观察

为什么要使用sp_MSforeachdb?您可以使用CTE通过使用系统表列出服务器上的所有数据库名称,然后可以编写动态sql来迭代merge语句的列表

以下是针对您的问题提出的解决方案

BEGIN
    USE ?;
    -- TO DO Check if table exists
    TRUNCATE TABLE #UnMatchedTransactions
    PRINT('truncate complete');
    -- To DO create #UnMatchedTransactions each time as database name changed so scope changed and table doesn't exist in new scope. Create table in each iteratation
    -- Second option use ##UnMatchedTransactions and delete row per database at the end
    INSERT INTO #UnMatchedTransactions
    SELECT
        DB_NAME(),
        TxnID,
        BatchID,
        DateCreated,
        CURRENT_TIMESTAMP,
        CURRENT_TIMESTAMP,
        0
    FROM
        UnMatchedTransactions;

    SELECT db_name(),'done';
    SELECT ClientName, COUNT(1) FROM #UnMatchedTransactions GROUP BY ClientName;

    CHECKPOINT;

    BEGIN TRANSACTION merge_tran
        MERGE INTO RedshiftDatabase.dbo.UnMatchedTransactions AS TARGET
        USING  #UnMatchedTransactions AS SOURCE
            ON  
            (
                TARGET.ClientName = SOURCE.ClientName 
            AND 
                TARGET.TxnID = SOURCE.TxnID
            AND 
                TARGET.BatchID = SOURCE.BatchID
            )
            WHEN MATCHED AND (TARGET.DateCreated <> SOURCE.DateCreated)
            THEN
                UPDATE SET 
                    DateCreated  = SOURCE.DateCreated, 
                    UpdatedTS = CURRENT_TIMESTAMP
            WHEN NOT MATCHED BY TARGET
            THEN
            INSERT ( ClientName,
                    TxnID,
                    BatchID,
                    DateCreated
                    ) 
            VALUES (SOURCE.ClientName,
                    SOURCE.TxnID,
                    SOURCE.BatchID,
                    SOURCE.DateCreated
                    )
            WHEN NOT MATCHED BY SOURCE 
            THEN 
                UPDATE SET 
                        TARGET.IsDeleted = 1,
                        TARGET.UpdatedTS = CURRENT_TIMESTAMP
            ;

    END TRANSACTION merge_tran;

    CHECKPOINT;

    SELECT db_name(),'Mergedone';
    SELECT BL_ClientName, COUNT(1) FROM RedshiftDatabase.dbo.UnMatchedTransactions GROUP BY ClientName;

    END;
    -- if using Second option then drop here so that temp tables cleaning would be done for each databaseuse
END

我想知道在foreachdb循环期间,临时实体UnMatchedTransactions是否会超出范围,因为每次迭代都会有一个新的连接我已经有好几年没有使用sql server了,所以请对这条评论持保留态度,但如果它有帮助的话,那就太好了。试着用括号括起所有对象的名称,甚至是?变量数据库名称的名称。