【问题标题】:Copy all values from source table to destination table dynamically in SQL Server. If there is some value in destination table then delete and insert在 SQL Server 中将所有值从源表动态复制到目标表。如果目标表中有一些值,则删除并插入
【发布时间】:2021-11-17 06:53:25
【问题描述】:

我创建了 2 个表并在我的源表中填充了值。

现在,我想将这些值动态填充到目标表中,并检查目标表中是否有任何值,然后删除所有这些值并从源中插入它们。

这是我没有执行的方法:

CREATE TABLE Customer
(
    CustomerID int NOT NULL,
    Customer_Name nvarchar(50) NULL,
    Customer_Address nvarchar(50) NULL,
    Contact int NULL,
    Created_Date int NULL
)

CREATE TABLE Customer_new
(
    CustomerID int NOT NULL,
    Customer_Name nvarchar(50) NULL,
    Customer_Address nvarchar(50) NULL,
    Contact int NULL,
    Created_Date int NULL
)

INSERT INTO Customer VALUES (1, 'Sarthak', 'cp192', 9560, 2022)
INSERT INTO Customer VALUES (2, 'Rashi', 'cp193', 9561, 2021)
INSERT INTO Customer VALUES (3, 'Rohan', 'cp194', 9562, 2020)
INSERT INTO Customer VALUES (4, 'Aman', 'cp195', 9564, 2019)

ALTER PROCEDURE spCustomera
    @Source_table nvarchar(100),
    @Dest_table nvarchar(100)
AS
BEGIN
    DECLARE @Target_Schema NVARCHAR(30)
    DECLARE @Source_Schema NVARCHAR(30)

    SELECT TABLE_NAME, TABLE_SCHEMA 
    INTO #data 
    FROM INFORMATION_SCHEMA.columns

    SELECT 
        @Dest_table = TABLE_NAME, 
        @Source_table = TABLE_NAME, 
        @Target_Schema =TABLE_SCHEMA, 
        @Source_Schema = TABLE_SCHEMA 
    FROM #data

    DECLARE @SQL AS nvarchar(1000)
    SET @SQL = (N'DELETE FROM ' + @Target_Schema + '.' + @Dest_table +
                 ' INSERT INTO ' + @Target_Schema + '.' + @Dest_table + 
                 '     SELECT * FROM ' + @Source_Schema + '.' + @Source_table)
        
    EXEC @SQL 
END

EXEC spCustomera @Source_table = 'customer', @Dest_table = 'customer_new'

【问题讨论】:

    标签: sql sql-server tsql dynamic-sql


    【解决方案1】:

    在您选择要提取目标表和源表名称的位置中,它们是同一个表。因此,您要从表中删除,然后尝试重新插入到同一个表中。

    我假设您的 Customer_new 表是目标表,Customer 是源表。

    您应该只需要更新以下行,将_new 添加到目标表名称的末尾,方法是将+ '_new' 添加到 select 语句的目标表部分:

    select @Dest_table = TABLE_NAME + '_new', @Source_table = TABLE_NAME, @Target_Schema =TABLE_SCHEMA                 
            , @Source_Schema = TABLE_SCHEMA from #data
    
    

    【讨论】:

    • 它仍然无法执行没有区别
    • 我的另一个建议是在删除和插入之间使用; 终止动态SQL 中的每个命令序列。即` SET @SQL = (N'DELETE FROM ' + @Target_Schema + '.' + @Dest_table + '; INSERT INTO ' + @Target_Schema + '.' + @Dest_table + 'SELECT * FROM ' + @Source_Schema + '。 ' + @Source_table)`
    • 为什么不将Customer_new 作为目标表,将Customer 作为源表,因为我在执行存储过程时提供参数?此外,在执行上述代码块时,它会自动在目的地使用Customer_new_new,在源自动使用Customer_new
    • 因为那不是你正在做的。您正在覆盖您在程序中传递的内容。不要覆盖源表和目标表参数。
    • 如果你能简要解释一下,我该如何覆盖它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2011-03-22
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多