在我们的数据库中,有一个表有80多个列。它有一个主键,并打开标识插入。我正在寻找一种方法,在每个列中插入 EXCEPT 来自不同数据库中相同表的主键列。
这可能吗?
答案 0 :(得分:49)
你可以很容易地做到这一点:
-- Select everything into temp table
Select * Into
#tmpBigTable
From [YourBigTable]
-- Drop the Primary Key Column from the temp table
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn]
-- Insert that into your other big table
Insert Into [YourOtherBigTable]
Select * From #tmpBigTable
-- Drop the temp table you created
Drop Table #tmpBigTable
如果你在“YourOtherBigTable”中有Identity Insert On并且列完全相同,那么你就可以了。
答案 1 :(得分:3)
CREATE TABLE Tests
(
TestID int IDENTITY PRIMARY KEY,
A int,
B int,
C int
)
INSERT INTO dbo.Tests
VALUES (1,2,3)
SELECT * FROM Tests
这适用于SQL2012
答案 2 :(得分:2)
您可以查询Information_Schema以获取所有列的列表,并以编程方式生成查询的列名称。如果你在t-sql中做这一切都会很麻烦,但是可以做到。如果你正在使用其他一些客户端语言,比如C#来进行操作,那就不那么麻烦了。
答案 3 :(得分:2)
不,那是不可能的。你可能想要使用
INSERT INTO MyLargeTable SELECT * FROM OtherTable
但这不起作用,因为您的标识列将包含在*。
中您可以使用
SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable SELECT * FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF
首先启用插入标识值,而不是复制记录,然后再次启用标识列。
但这也不会奏效。在这种情况下,SQL Server不接受*。您必须在脚本中明确包含Id,例如:
SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF
所以我们从我们开始的地方回来了。
最简单的方法是右键单击Management Studio中的表,让它生成INSERT和SELECT脚本,然后稍微编辑它们以使它们一起工作。
答案 4 :(得分:1)
为什么不创建原始数据的VIEW,删除不需要的字段? 然后选择*进入'你的心愿。
答案 5 :(得分:0)
真的,老实说,从对象浏览器中提取所有列需要十秒或更短时间,然后从列表中删除标识列。除了快速的即席查询之外,使用select *进行任何操作都是一个坏主意。
答案 6 :(得分:-1)
在回答相关问题(SELECT * EXCEPT)时,我指出真正的关系语言Tutorial D允许以要删除的属性而不是要保留的属性来表示投影。
my_relvar { ALL BUT description }
然而,其INSERT
语法要求元组值构造函数包含属性名称/值对,例如
INSERT P
RELATION
{
TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) },
TUPLE { PNO PNO ( 'P2' ) , PNAME CHARACTER ( 'Bolt' ) }
};
当然,使用这种语法没有列排序(因为它是真正的关系!),例如这在语义上是等价的:
INSERT P
RELATION
{
TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) },
TUPLE { PNAME CHARACTER ( 'Bolt' ) , PNO PNO ( 'P2' ) }
};
另一种选择是完全依赖属性排序,而SQL则部分地依赖于属性排序。这是一个与上述相近的SQL:
INSERT INTO P ( PNO , PNAME )
VALUES
( PNO ( 'P1' ) , CAST ( 'Nut' AS VARCHAR ( 20 ) ) ) ,
( PNO ( 'P2' ) , CAST ( 'Bolt' AS VARCHAR ( 20 ) ) );
一旦指定了列的commalist,VALUES
行构造函数就会维护此顺序,这是不理想的。但至少指定了订单:您的提案将依赖于某些默认订单,这可能是非确定性的。