自动创建包含n列的表

时间:2013-09-25 09:50:05

标签: sql-server tsql ddl

我想在一行中将236个int值存储到sql中。现在我必须声明表,但我不想输入列名的236倍。 Columnnames应该是BYTE001,BYTE002,......或其他前缀为BYTE(B,INT,...)的东西。 可以自动生成ColumnNames吗?

我尝试以下代码但不起作用:

USE dbXXX
DECLARE @Columname varchar(10)
SET @Columname = 'BYTE011'
ALTER table tbl_Archiv_BYTEsps
ADD @Columname int;

我想在while循环中生成列名,但似乎不允许在ADD-Command中使用变量。我alwasys在'@Columname'附近得到错误:错误的语法 我该怎么做才能生成表格?或者有另一种存储我的236整数值的方法吗?

3 个答案:

答案 0 :(得分:3)

试试这个 -

IF OBJECT_ID ('dbo.temp') IS NOT NULL
   DROP TABLE dbo.temp

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = 'CREATE TABLE dbo.temp (ID INT IDENTITY(1,1) PRIMARY KEY, ' + STUFF((
    SELECT ', BYTE' + RIGHT('000' + CAST(sv.number AS VARCHAR(3)), 3) + ' INT'
    FROM [master].dbo.spt_values sv
    WHERE sv.[type] = 'p'
        AND sv.number BETWEEN 1 AND 236
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')'

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出 -

CREATE TABLE dbo.temp (ID INT IDENTITY(1,1) PRIMARY KEY, BYTE001 INT, BYTE002 INT, BYTE003 INT, BYTE004 INT, BYTE005 INT, BYTE006 INT, BYTE007 INT, BYTE008 INT, BYTE009 INT, BYTE010 INT, BYTE011 INT, BYTE012 INT, BYTE013 INT, ... , BYTE235 INT, BYTE236 INT)

答案 1 :(得分:2)

现在我写了这段代码:

USE sip_audi_01
DECLARE @Columname varchar(10)
DECLARE @integer int
DECLARE @query VARCHAR(MAX)
SET @integer = 0
SET @Columname = 'BYTE'
SET @query='ALTER table tbl_Archiv_BYTEsps ADD '+@Columname+' int'
WHILE @integer = 235
BEGIN
  SET @integer = @integer + 1
  SET @Columname = @Columname + CAST(@integer AS char)
  EXEC (@query)
  PRINT 'Nummer:' + CAST(@integer AS char)
END;

但没有发生任何事情....我可以在哪里读取SQL-Server ManagementStudio中的打印输出? @Devart,对不起,但你的代码对我来说太难了。

答案 2 :(得分:0)

您需要使用动态sql来执行此查询。

DECLARE @query VARCHAR(MAX)

SET @query='ALTER table tbl_Archiv_BYTEsps ADD '+@Columname+' int'
EXEC (@query)

但我认为最好检查一下你的表结构,因为为一个表维护236列似乎有些混乱。