确定哪些类型需要长度规范
Determine which types require a length specification
如何确定类型是否需要指定长度?
理想情况下,我想按类型了解这一点。 INFORMATION_SCHEMA.COLUMNS 下面@ZoharPeled 提到的按列列出信息,但它只有与数据库中已存在的列相对应的类型,而不是所有可能的类型。
在生成动态 SQL 时,我直到运行时才知道其数据类型或名称,我需要创建一个 table 变量来存储 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:
我需要能够支持每个主要数据库,因此每个数据库都有一个用于不同操作的模板。进行中的 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",等等
在添加加入 table 支持之前,之前的模板生成 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}
等,就是大量的手动字符串操作。
您可以改用 INFORMATION_SCHEMA.COLUMNS
,在该视图中,当不应有内容长度时,CHARACTER_MAXIMUM_LENGTH
列为空,当它最大时(如 varchar(max)
或 varbinary(max)
它表示 -1
如何确定类型是否需要指定长度? 理想情况下,我想按类型了解这一点。 INFORMATION_SCHEMA.COLUMNS 下面@ZoharPeled 提到的按列列出信息,但它只有与数据库中已存在的列相对应的类型,而不是所有可能的类型。
在生成动态 SQL 时,我直到运行时才知道其数据类型或名称,我需要创建一个 table 变量来存储 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:
我需要能够支持每个主要数据库,因此每个数据库都有一个用于不同操作的模板。进行中的 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",等等
在添加加入 table 支持之前,之前的模板生成 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}
等,就是大量的手动字符串操作。
您可以改用 INFORMATION_SCHEMA.COLUMNS
,在该视图中,当不应有内容长度时,CHARACTER_MAXIMUM_LENGTH
列为空,当它最大时(如 varchar(max)
或 varbinary(max)
它表示 -1