[英]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.