确定哪些类型需要长度规范

时间:2016-03-13 08:12:29

标签: sql-server metadata dynamic-sql

如何确定类型是否需要长度规格? 理想情况下,我想通过类型了解这一点。 @ZoharPeled在下面提到的INFORMATION_SCHEMA.COLUMNS按列列出了信息,但它只有与数据库中已存在的列对应的类型,而不是每种可能的类型。

在生成动态SQL时,我不知道数据类型或名称直到运行时,我需要创建一个表变量来存储Inserted.X results

我将查询中的数据类型记录到sys.columns,但是,我还需要指定某些类型的长度。我可以从sys.columns.max_length获得。但是,某些类型(如 int )在指定长度时会产生错误(例如DECLARE @n int(4)),而我无法弄清楚如何声明每个必须如何声明。< / p>

在下面的SQL中,namemd5 必须有一个长度,Id必须

DECLARE @_cnb TABLE (Id int, name nvarchar, md5 varbinary);
INSERT INTO dbo._users (name, md5)
OUTPUT Inserted.Id, Inserted.name, Inserted.md5 INTO @_cnb
VALUES (@a,@b) OPTION (MAXDOP 1);
-- Do stuff with contents of table variable

我如何生成SQL:

我需要能够支持每个主要数据库,因此每个数据库都有一个用于不同操作的模板。正在进行的MS SQL插入模板是:

BEGIN
{0}
INSERT INTO {1} ({2})
OUTPUT {3} INTO @_cnb
VALUES ({4}) OPTION (MAXDOP 1);
{5}
END;

然后我填写每个部分。 {1}是table.schema,{3}是“Inserted.FOO,Inserted.BAR”等。

在添加联接表支持之前,先前的模板生成了SQL,如下所示:

INSERT INTO _users
    (first_name,last_name,site_id,site_id2,name)
VALUES (@a,@b,@c,@d,@e)

现在(叹气)看起来更像是:

BEGIN
DECLARE @_cnb TABLE (Id int,first_name nvarchar,last_name nvarchar,site_id int,site_id2 int);
INSERT INTO dbo._users (first_name,last_name,site_id,site_id2)
OUTPUT Inserted.Id, Inserted.first_name, Inserted.last_name, Inserted.site_id, Inserted.site_id2 INTO @_cnb
VALUES (@a,@b,@c,@d) OPTION (MAXDOP 1);
INSERT INTO dbo._user_access (user_id,access_id)
SELECT Id,@e FROM @_cnb;
-- others
INSERT INTO dbo._cars2 (user_id,name)
SELECT Id,@n FROM @_cnb;
END;

至于构建{0}{1}等,这只是很多手动字符串操作。

1 个答案:

答案 0 :(得分:0)

您可以在该视图中使用INFORMATION_SCHEMA.COLUMNS,当CHARACTER_MAXIMUM_LENGTH列没有内容长度时,varchar(max)列为空,并且当它为最大值时(例如varbinary(max)或{{1}它陈述-1