如何确定类型是否需要长度规范?理想情况下,我想按类型来了解这一点。下面@ZoharPeled提到的INFORMATION_SCHEMA.COLUMNS按列列出了信息,但是它只有与数据库中已经存在的列相对应的类型,而不是所有可能的类型。
在生成动态SQL (直到运行时才知道数据类型或名称)时,我需要创建一个表变量来存储Inserted.X results。
我记录了从查询到sys.columns的数据类型,但是我也需要指定某些类型的长度。我可以从sys.columns.max_length那里得到。但是,某些类型(如int )在指定长度时会产生错误(例如,DECLARE @n int(4)),而且我还无法知道如何声明每个类型。
在下面的SQL中,name和md5必须有长度,而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:
我需要能够支持每个主要的数据库,因此每个数据库都有一个针对不同操作的模板。正在进行的模板是:
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}等,这只是大量的手工字符串操作。
发布于 2016-03-14 04:32:43
您可以使用INFORMATION_SCHEMA.COLUMNS替代,在该视图中,当没有内容长度时,CHARACTER_MAXIMUM_LENGTH列是空的,当它是最大值时(比如在varchar(max)或varbinary(max)中,它声明为-1)
https://stackoverflow.com/questions/35968052
复制相似问题