Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 在不命名所有列的情况下更新表_Sql Server 2005_Insert Update_Multiple Columns - Fatal编程技术网

Sql server 2005 在不命名所有列的情况下更新表

Sql server 2005 在不命名所有列的情况下更新表,sql-server-2005,insert-update,multiple-columns,Sql Server 2005,Insert Update,Multiple Columns,我找到了一种方法,可以使用此模板使来自不同数据库的两个表相互匹配: INSERT [DestDB].[dbo].[TABLE] SELECT source.* FROM [SourceDB].[dbo].[TABLE] AS source LEFT OUTER JOIN [DestDB].[dbo].[TABLE] AS dest ON source.[PKColumn] = dest.[PKColumn] WHERE dest.[PKcolumn] IS NULL UPDATE dest

我找到了一种方法,可以使用此模板使来自不同数据库的两个表相互匹配:

INSERT [DestDB].[dbo].[TABLE]
SELECT source.* FROM 
[SourceDB].[dbo].[TABLE] AS source
LEFT OUTER JOIN
[DestDB].[dbo].[TABLE] AS dest
ON 
source.[PKColumn] = dest.[PKColumn]
WHERE dest.[PKcolumn] IS NULL

UPDATE dest
SET 
 dest.[PK_COLUMN1] = source.[PK_COLUMN1]
,dest.[COLUMN2] = source.[COLUMN2]
,dest.[COLUMN3] = source.[COLUMN3]
,dest.[COLUMN4] = source.[COLUMN4]
,dest.[COLUMN5] = source.[COLUMN5]
,dest.[COLUMN6] = source.[COLUMN6]
,dest.[COLUMN7] = source.[COLUMN7]
,dest.[COLUMN8] = source.[COLUMN8]

FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]
然而,我正在处理的一些表至少有200列,虽然通过复制+粘贴的功能可以做到这一点,但我只需要知道是否有一种方法不涉及我患腕管综合症

我正在使用Microsoft SQL Server 2005


有什么建议吗?

我不认为您可以在不命名列的情况下更新列,但您可以使用SQL和sys.columns视图为您编写脚本:

select ',dest.[' + name + '] = source.[' + name +']' 
from sys.columns 
WHERE object_id = OBJECT_ID(N'[dbo].[Widgets]')
-输出-

,dest.[WidgetId] = source.[WidgetId]
,dest.[WidgetName] = source.[WidgetName]
,dest.[CreatedDt] = source.[CreatedDt]
,dest.[WidgetValue] = source.[WidgetValue]
,dest.[ModifiedDt] = source.[ModifiedDt]
唯一的另一种方法是不更新,而是截断dest表并执行SELECT INTO


您可以使用动态sql和提供的info@ChrisGessler来执行您想要的操作

如果您不能或不想使用,另一种可能性是:

将匹配的行传递到新表中 删除dest表中的行 在dest表中添加行 步骤1可能是这样的:

SELECT * INTO newtable
FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]

记住在最后删除新表。

两个表dest和source中的所有列是否匹配?如果由于引用完整性,dest表中有FK,这将不起作用。如果不是这样,为什么还要费心将行从一个表复制到另一个表,而不只是删除并完全重新插入dest表?@oerl这也确实解决了另一种情况,即删除dest表中的行。。我发现,这在更新中是罕见的。首先:救生员。其次,此代码将不起作用,因为在更新时,不允许为正在更新的表提供别名。例如,从SourceTable source更新[DestTable]dest SET dest.RecordType=source.RecordType。。将不起作用如何使其起作用是通过删除别名:UPDATE DestTable SET RecordType=Source.RecordType FROM sourceTable sourceYes,别名可用于UPDATE语句。但是如果没有代码,代码也会同样有效。
SELECT * INTO newtable
FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]