Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 合并用于暂存的表_Sql Server 2008_Tsql_Ssis - Fatal编程技术网

Sql server 2008 合并用于暂存的表

Sql server 2008 合并用于暂存的表,sql-server-2008,tsql,ssis,Sql Server 2008,Tsql,Ssis,这段实验性代码能否实现我将源表复制为暂存数据库中的目标表的目标 IF OBJECT_ID('tempdb..#Source') IS NOT NULL DROP TABLE #Source IF OBJECT_ID('tempdb..#Target') IS NOT NULL DROP TABLE #Target CREATE TABLE #Source ( Id INT, Value CHAR(2) ) CREATE TABLE #Target ( Id INT, Value

这段实验性代码能否实现我将源表复制为暂存数据库中的目标表的目标

IF OBJECT_ID('tempdb..#Source') IS NOT NULL
    DROP TABLE #Source
IF OBJECT_ID('tempdb..#Target') IS NOT NULL
    DROP TABLE #Target

CREATE TABLE #Source ( Id INT, Value CHAR(2) )
CREATE TABLE #Target ( Id INT, Value CHAR(2) )

INSERT  INTO #Source
        ( Id, Value ) values (1,'a'), (2,'b')    
INSERT  INTO #Target
        ( Id, Value )
        SELECT  1 ,
                'a1'

SELECT * FROM #Source
SELECT * FROM #Target

MERGE [#Target] AS Target
   USING [#Source] AS Source
     ON Target.Id = Source.Id
WHEN MATCHED AND
    (
         COALESCE(Target.Value, '') <> COALESCE(Source.Value, '')
    )
    THEN UPDATE SET
       Target.Value = Source.Value
WHEN NOT MATCHED
    THEN INSERT (
        Id
       ,Value
      ) VALUES (
        Source.Id
       ,Source.Value
      );

SELECT * FROM #Source
SELECT * FROM #Target 

欢迎任何改进/批评。

是的,这将实现您的目标


您可以做的另一件事是在执行合并时执行增量/增量加载。仅从源表中获取上次运行后修改的记录。您可以使用UpdateDate列作为筛选列,并在每次运行合并或ETL时将上次运行的日期存储在不同的表中。

谢谢。是否有任何工具可以帮助您创建这些合并语句?我有一个遗留数据库,它有大约120列!可以使用sys.table和sys.columns系统视图创建动态脚本来创建合并语句。检查此链接以供参考:合并是对列值应用函数。这意味着比较不能使用任何索引。表中是否允许空值?如果它们不是,那么只需删除函数即可。如果它们不是,那么最好编写一个简单的相等性检查,并为空检查添加两个OR。在gvee上询问这一点可能会更好-我确实说过,他们说我的代码过于简单,因为它不是生产代码-:请确保您了解该语句的潜在缺点感谢billinkc,您使用什么在暂存数据库中复制源表?在本例中,我使用不同的表,您可以使用您的表并进行检查
Below is the complete script to merge the two tables 


CREATE TABLE StudentDetails
(
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(15)
)
GO
INSERT INTO StudentDetails
VALUES(1,'SMITH')
INSERT INTO StudentDetails
VALUES(2,'ALLEN')
INSERT INTO StudentDetails
VALUES(3,'JONES')
INSERT INTO StudentDetails
VALUES(4,'MARTIN')
INSERT INTO StudentDetails
VALUES(5,'JAMES')
GO
CREATE TABLE StudentTotalMarks
(
StudentID INTEGER  ,
StudentMarks INTEGER
)
GO
INSERT INTO StudentTotalMarks
VALUES(1,230)
INSERT INTO StudentTotalMarks
VALUES(2,255)
INSERT INTO StudentTotalMarks
VALUES(3,200)
GO
-- Select from Table
SELECT *
FROM StudentDetails
GO
SELECT *
FROM StudentTotalMarks
GO
-- Merge Statement
MERGE StudentTotalMarks AS stm
USING (
SELECT StudentID,StudentName FROM StudentDetails
)
 AS sd
ON stm.StudentID = sd.StudentID
WHEN MATCHED AND stm.StudentMarks > 250 THEN DELETE
WHEN MATCHED THEN UPDATE SET stm.StudentMarks = stm.StudentMarks + 25
WHEN NOT MATCHED THEN
INSERT(StudentID,StudentMarks)
VALUES(sd.StudentID,25);
GO
-- Select from Table
SELECT *
FROM StudentDetails
GO
SELECT *
FROM StudentTotalMarks
GO
-- Clean up
DROP TABLE StudentDetails
GO
DROP TABLE StudentTotalMarks
GO