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;
我有两个 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;