4

多数のユーザー定義SQLタイプを持つレガシーデータベースを使用しています。SqlParameterオブジェクトでパラメーターを定義している.NETでメソッドを作成しています。実行時に動的にパラメーターを作成するときにパラメーターを適切に定義するには、ユーザー定義型の基礎となる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'

これが、ユーザー定義型の基礎となる基本型を取得するための最良の方法であるかどうか疑問に思っていますか?

4

2 に答える 2

9

systypesまたはsyscolumnsを使用しないでください。これらは下位互換性ビューです。SQLServer2000+で動作するコードを記述しようとしている場合を除き、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');

エイリアスタイプ(例)を使用すると、2行が返されることに注意してください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
于 2012-05-21T17:33:50.607 に答える
0

データベース内のすべてのユーザー定義タイプの情報を取得するには、INFORMATION_SCHEMA.DOMAINSを使用できます。

SELECT 
   DOMAIN_SCHEMA,
   DOMAIN_NAME,
   DATA_TYPE,
   NUMERIC_PRECISION,
   NUMERIC_SCALE,
   DATETIME_PRECISION,
   CHARACTER_MAXIMUM_LENGTH

FROM 
   INFORMATION_SCHEMA.DOMAINS

UPD:次のクエリは、すべてのユーザー定義タイプに対して人間が読める形式の定義を返します。

  SELECT 
     DOMAIN_SCHEMA + '.' + DOMAIN_NAME AS TypeName,
     DATA_TYPE + 
        COALESCE('('+ 
           CAST(COALESCE(NUMERIC_PRECISION,DATETIME_PRECISION,CHARACTER_MAXIMUM_LENGTH) AS VARCHAR) + 
           COALESCE(',' + CAST(NUMERIC_SCALE AS VARCHAR),'') +
        ')','') AS Definition

  FROM 
  (
     SELECT 
        DOMAIN_SCHEMA,
        DOMAIN_NAME,
        DATA_TYPE,
        CASE 
           WHEN DATA_TYPE IN ('tinyint','smallint','int','bigint') THEN NULL
           ELSE NUMERIC_PRECISION
        END AS NUMERIC_PRECISION,
        NUMERIC_SCALE,
        CASE 
           WHEN DATA_TYPE IN ('smalldatetime','datetime','date') THEN NULL
           ELSE DATETIME_PRECISION
        END AS DATETIME_PRECISION,
        CHARACTER_MAXIMUM_LENGTH

     FROM 
        INFORMATION_SCHEMA.DOMAINS
  ) T

(私が自分で使用しているタイプについてのみテスト済み)

于 2014-12-02T18:05:10.180 に答える