自动创建包含多个列的SQL表

时间:2015-08-18 12:39:29

标签: sql sql-server database-design ssms

我必须创建一个包含90多个字段的SQL表,其中大多数是位字段,如N01,N02,N03 ... N89,N90是否有创建多个文件的快速方法,或者是否可以有一个单独的字段字段包含值数组true / false?我需要一个也可以轻松查询的解决方案。

4 个答案:

答案 0 :(得分:3)

没有简单的方法可以做到这一点,对这样的表进行查询将非常具有挑战性。创建一个包含三列的表 - 项目编号,位字段编号和值字段。然后,您将能够针对表格编写“好”简洁的Tsql查询。

答案 1 :(得分:1)

至少可以为位字段生成ALTER TABLE脚本,然后运行这些脚本。

DECLARE @COUNTER INT = 1
WHILE @COUNTER < 10
BEGIN
    PRINT 'ALTER TABLE table_name ADD N' + RIGHT('00' + CONVERT(NVARCHAR(4), @COUNTER), 2) + ' bit'
    SET @COUNTER += 1
END

答案 2 :(得分:1)

TLDR:使用二进制算术。

对于像这样的结构

==============
Table_Original
==============
Id | N01| N02 |...

我建议使用像这样的替代表格结构

==============
Table_Alternate
==============
Id | One_Col

One_Col属于varchar类型,其值设置为

cast(n01 as nvarchar(1)) + cast(n02 as nvarchar(1))+ cast(n03 as nvarchar(1)) as One_Col

但我觉得您使用C#或其他编程语言将值设置为列。您还可以使用位和位移操作。

每当需要获取值时,可以使用SQL或C#语法(视为字符串处理) 在SQL查询术语中,您可以使用类似

的查询
SELECT SUBSTRING(one_col,@pos,1) 

@pos可以设置为

DECLARE @Colname nvarchar(4)
SET @colname=N'N32'
 --    ....
SET @pos= CAST(REPLACE(@colname,'N','') as INT)

您也可以在任何编程语言中轻松使用二进制算法。

答案 3 :(得分:0)

使用三列。

Table
ID         NUMBER,
FIELD_NAME VARCHAR2(10),
VALUE      NUMBER(1)

实施例

ID FIELD        VALUE
1    N01        1
1    N02        0
.
1    N90        1
.
2    N01        0
2    N02        1
.
2    N90        1
.

您还可以对字段名称(或fieldnameS)执行OR整个列:

select DECODE(SUM(VALUE), 0, 0, 1) from table where field_name = 'N01';

甚至执行AND

select EXP(SUM(LN(VALUE))) from table where field_name = 'N01';

(see http://viralpatel.net/blogs/row-data-multiplication-in-oracle/)