SQL 服务器:查询将一行复制到另一行 table 没有标识

SQL Server : query to copy one row to another table without identity

我有两个 table 具有相同但未知的结构。未知,因为我需要的查询将在多个 table 对上执行,这些对彼此不同。

Table 1 有几行,Table 2 有很多行。我需要做的是将基于 ID(身份)的行复制到第二个 table,但不在插入语句中指定身份,因为它已经在目标 table 上使用.所以新的 table 应该有相同的行,但 ID 不同。我想用一个查询来做到这一点。

示例:

Table 1:

ID    mycol1
--------------
1     10
2     423
3     5345
4     ew3

Table 2:

ID     mycol2
--------------
.      ..
529    103
530    652
531    sa3

期望的结果:将 ID 为 2 的行从 table1 复制到 table2(table2 上的新 ID)

ID      mycol2
---------------
...     ...
529     103
530     652
531     sa3
532     423

这是一个包含发明列的示例 table,但查询应该适用于具有任何结构的任何 table。每个 table 都会将“ID”列作为标识。我知道如何使用已知的列来做,但是如果 table 的结构完全未知,我不知道如何做。

您可以使用动态 SQL 执行此操作。请小心,因为动态 SQL 可能很难正确编写,并且如果没有正确编写则容易 SQL 注入。

确保参数化正确。

table 名称必须直接嵌入动态代码中,为此使用 QUOTENAME

@id参数可以一路传过去。使用EXEC sp_executesql,你需要传递一个字符串参数给它,描述你传递的实际参数。

DECLARE @source nvarchar(128) = N'table1';
DECLARE @dest nvarchar(128) = N'table2';
DECLARE @id int = 123;

DECLARE @cols nvarchar(max) =
(SELECT STRING_AGG(CAST(QUOTENAME(c.name) AS nvarchar(max)), N', ')
    FROM sys.columns c
    WHERE c.object_id = OBJECT_ID(@source)
);

DECLARE @sql nvarchar(max) =
N'INSERT ' + QUOTENAME(@target) + N'
    (' + @cols + N')' + N'
SELECT ' + @cols + N'
FROM ' + QUOTENAME(@source) + N' AS t
WHERE t.id = @id;
';

-- PRINT @sql    -- for testing

EXEC sp_executesql
    @sql,
    N'@id int',
    @id = @id;