繁体   English   中英

如何从 SQL 服务器中的另一个表的数据中添加表中的列?

[英]How to add column in table from a data of another table in SQL Server?

我正在尝试从另一个表的数据向表中添加一列。 我想要的就像

Select Mname, datatype from tableA

此查询将返回如下数据:

A|float
B|float
C|int

我想将此数据添加为另一个表中数据类型的列名

Alter table tableB 
Add A float null, B float null, C int null

我怎样才能做到这一点?

您可以为此使用动态 SQL。 但是,由于您没有比例和精度列,因此将使用默认值。 对于像datetime2这样的东西,这将是(7) ,但对于decimal ,这将是(18,0)而对于varchar ,它将是(1) ,这可能使它们不合适。 因此,您可能需要解决您的设计问题,以包括精度和比例。

我还检查了datatype中的数据类型是否确实存在,并且该列在表TableB中尚不存在; 如果它们会引起问题,这些列将被省略。 如果你愿意,你可以省略这个逻辑,这意味着如果数据类型不存在,就会抛出一个错误; 这取决于你想要什么行为。

我还假设您使用的是完全受支持的 SQL 服务器版本; 如果没有,您需要使用“旧” FOR XML PATH (和STUFF )方法进行字符串聚合。

DECLARE @SQL nvarchar(MAX);

SELECT @SQL = N'ALTER TABLE dbo.TableB ADD ' + STRING_AGG(QUOTENAME(A.Mname) + N' ' + QUOTENAME(t.[name]) + N' NULL',N', ') + N';'
FROM dbo.TableA A
     JOIN sys.types t ON A.datatype = t.[name]
WHERE NOT EXISTS (SELECT 1
                  FROM sys.columns c
                  WHERE c.name = A.Mname
                    AND c.object_id = OBJECT_ID(N'dbo.TableA'));

--PRINT @SQL;
EXEC sys.sp_executesql @SQL;

数据库<>小提琴

尝试以下动态 SQL

STRING_AGG()仅适用于SQL Server 2017及更高版本。

create table tableA (mname varchar(10), datatype varchar(100))
create table tableB (id int)

insert into tableA Values('A','int')
insert into tableA Values('B','float')
insert into tableA Values('C','int')

declare @ColNames varchar(1000) = '', @executeQuery NVARCHAR (MAX)

select @ColNames = STRING_AGG(mname + ' ' + datatype,',') from tableA

SELECT @executeQuery = 'Alter table tableB ADD ' + @ColNames

EXEC sys.sp_executesql @executeQuery;

select * from tableB

drop table tableA
drop table tableB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM