gpt4 book ai didi

sql - 查找用户定义类型的 SQL 基本类型

转载 作者:行者123 更新时间:2023-12-01 09:34:32 25 4
gpt4 key购买 nike

我正在使用具有大量用户定义的 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'

我想知道这是否是获取用户定义类型的基础基类型的最佳方法?

最佳答案

您不应该使用 systypes 或 syscolumns - 这些是向后兼容性 View ,除非您尝试编写适用于 SQL Server 2000+ 的代码(我也不推荐),否则强烈建议使用 sys.types 和 sys.columns .

要获取有关您已经知道名称的类型的信息:

SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE name = 'bVendor';

要获取数据库中所有用户定义类型的信息:
SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE is_user_defined = 1;

要获取有关特定表的所有类型(系统和用户定义)的信息:

更新 包括基本类型:
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');

请注意,如果您使用别名类型(例如 CREATE TYPE blat FROM nvarchar(32); ),这将返回两行。如果你真的必须使用那些( I recommend against them, also ),那么将 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

关于sql - 查找用户定义类型的 SQL 基本类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com