Aar*_* L. 3 sql sql-server-2008
我正在使用具有大量用户定义的SQL类型的遗留数据库.我在.NET中编写一个方法,我在其中定义SqlParameter对象中的参数.我需要用户定义类型的底层SQL类型,以便在运行时动态创建参数时正确定义参数.
为此,我创建了这个过程:
(@typename sysname)
AS
SET NOCOUNT ON
SELECT distinct
st.name as UserType,
t.precision, t.max_length,
bt.name as BaseType
FROM
dbo.syscolumns c
INNER JOIN dbo.systypes st ON st.xusertype = c.xusertype
INNER JOIN dbo.systypes bt ON bt.xusertype = c.xtype
inner join sys.types t on st.name = t.name
WHERE
st.name = 'bVendor'
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是获取用户定义类型的基础类型的最佳方法?
您不应该使用systypes或syscolumns - 这些是向后兼容性视图,并且sys.types和sys.columns是高度优先的,除非您尝试编写适用于SQL Server 2000+的代码(我不建议这样做) .
要获取有关类型的信息,您已知道以下名称:
SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE name = 'bVendor';
Run Code Online (Sandbox Code Playgroud)
要获取数据库中所有用户定义类型的信息:
SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE is_user_defined = 1;
Run Code Online (Sandbox Code Playgroud)
要获取有关特定表的所有类型(系统和用户定义)的信息:
更新以包括基本类型:
SELECT
[column] = c.name,
[base type] = COALESCE(bt.name, t.name),
[defined type] = t.name,
t.precision,
t.scale,
t.max_length
FROM sys.columns AS c
INNER JOIN sys.types AS t
ON c.system_type_id = t.system_type_id
AND c.user_type_id = t.user_type_id
LEFT OUTER JOIN sys.types AS bt
ON t.is_user_defined = 1
AND bt.is_user_defined = 0
AND t.system_type_id = bt.system_type_id
AND t.user_type_id <> bt.user_type_id
WHERE c.object_id = OBJECT_ID('dbo.your_table_name');
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用别名类型(例如CREATE TYPE blat FROM nvarchar(32);),这将返回两行.如果你真的必须使用它们(我也建议不要使用它们),那么将join子句更改为:
ON t.is_user_defined = 1
AND bt.is_user_defined = 0
AND t.system_type_id = bt.system_type_id
AND bt.user_type_id = bt.system_type_id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1750 次 |
| 最近记录: |