TSQL选择临时表并添加Id

时间:2017-06-07 08:09:07

标签: sql-server tsql merge

我目前正致力于SQL Server 2014上的T-SQL查询。

我尝试从1个表格中选择数据到另一个表格,并为每一行添加额外的ID。

我的查询如下:

DECLARE @TargetId = 1

SELECT * INTO #tmpProjects FROM @Projects 
UNION SELECT @TargetId AS 'TargetId'

不幸的是,这个Select语句不起作用......

我想要的输出 #tmpProjects 应如下所示:

ProjectId |    Title    | Manager   | TargetId 
----------+-------------+-----------+-----------
1         |   projectX  |   1123    |  1 
2         |   projectY  |   2245    |  1
3         |   projectZ  |   3335    |  1

在我的导入表 @Projects 中,我得到了ProjectId,Title和Manager列。

您知道如何解决这个问题吗?那么要选择一个临时表并添加一个额外的Id?

非常感谢!!

2 个答案:

答案 0 :(得分:1)

如果要在表中添加额外的列,则需要更改它以添加新列。 要保留列中的默认值,您可以使用 DEFAULT 关键字并提供值。 请在下面找到查询,我希望这会有所帮助:

CREATE TABLE PROJECTS(ProjectId int, Title varchar(50), Manager varchar(50))
INSERT INTO PROJECTS 
VALUES
(1, 'projectX' , '1123'),
(2, 'projectY' , '2245'),
(3, 'projectZ' , '3335')
GO
BEGIN
SELECT * INTO #tmpProjects FROM PROJECTS
ALTER TABLE  #tmpProjects ADD TargetId INT NOT NULL DEFAULT (1)
SELECT * FROM #tmpProjects
END

您不能在default关键字中使用任何变量。但是你可以创建一个标量函数来使用你选择的任何变量。 您可以查看此链接,了解如何使用标量函数将默认值添加到列中。

ALTER TABLE with programmatically determined constant DEFAULT value

此处还有一件事。如果要使用 DEFAULT 关键字插入默认值,则必须明确将列定义为 NOT NULL 。 如果您没有这样做,那么它只会包含 NULL 值,并且不会插入您使用 DEFAULT 关键字提供的任何值

代码:

ALTER TABLE  #tmpProjects ADD TargetId INT NOT NULL DEFAULT (1)

这会在TargetId列中插入 1 。但是,

ALTER TABLE  #tmpProjects ADD TargetId INT DEFAULT (1)

这将在TargetId列中插入 NULL

希望这能解决您的问题。

答案 1 :(得分:1)

   create table #tmpProjects 
     (
        ProjectId varchar(20) , 
        Title varchar(20) ,
         Manager varchar(20), 
         TargetId varchar(20)
     )
DECLARE @Projects table (ProjectId varchar(20) , Title varchar(20) ,Manager varchar(20))
insert into @Projects values ('p1' , 't1' , 'm1')
insert into @Projects values ('p2' , 't2' , 'm2')
select * from @Projects

------------- **solution starts here**  ---------------
DECLARE @TargetId int 
set @TargetId = 1
insert into #tmpProjects ( ProjectId ,Title , Manager ,  TargetId )
select  ProjectId ,Title , Manager , @TargetId
from @Projects

select * from #tmpProjects