如何使用表的行作为新表的名称

时间:2017-05-11 09:40:18

标签: sql sql-server

我有一个表,我想用这个行名创建新表,所以每一行都是不同的表。

首先,我选择了我需要的数据并放入我的表格

declare @cDeviceID  nvarchar(max)
declare @cAllin nvarchar(max)
set @cAllin = ''
create table d14 (Techem_Device varchar(max))

declare DeviceID cursor dynamic
for
select DeviceID from DEVICES where Manufacture='Socomec'

open DeviceID
fetch first from DeviceID into @cDeviceID

while @@FETCH_STATUS = 0
begin

    set @cAllin = 'T' + @cDeviceID
    insert into D14 select @cAllin 
    fetch next from DeviceID into @cDeviceID

END
Close DeviceID
deallocate DeviceID

之后我尝试创建查询:

exec ('create table' + @cAllin + '(Datum datetime, Device_0, Device_1)')

但是这创建了错误消息:

  

未知对象类型' tableT25882'用于CREATE,DROP或ALTER   言。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

此处table关键字和表名之间错过了空格:

exec ('create table' + @cAllin + '(Datum datetime, Device_0, Device_1)')

当表名将被保留为关键字时,最好将表名包装成方括号:

exec ('create table [' + @cAllin + '] (Datum datetime, Device_0, Device_1)')

另请注意,您尚未指定Device_0, Device_1列的列类型。

答案 1 :(得分:0)

正如安迪回答中提到的那样错过了,但我想向你提出另一个解决方案。你可以避免CURSOR使用它:

SELECT 'CREATE TABLE [' + DeviceID + '] (Datum DATETIME, Device_0, Device_1)
GO
'
FROM DEVICES
WHERE Manufacture='Socomec'

在SSMS中使用结果到文本选项。它生成脚本,允许您根据DEVICES表值创建表。

请记住为所有列指定数据类型。