2

自分のやりたいことが実現できるかどうかもわからないし、ただただ興味津々です。

TINYINT である MyType というユーザー定義型と、許容値が 0 から 3 の間でなければならないことを示す RULE があります。

-- Existing UDT & Rule which work
CREATE TYPE [MySchema].[MyTypes]
FROM [TINYINT]

CREATE RULE [MySchema].[MyTypes_Rule] AS
@Range BETWEEN 0 AND 3

sp_bindrule 'MySchema.MyTypes_Rule', 'MySchema.MyTypes'

私が知りたいのは、追加のルール/機能を追加して、NVARCHAR値を取り、その範囲内にある場合は適切なTINYINT値に変換する追加のルールを作成できるようにすることです。

CREATE RULE [MySchema].[MyTypes_NVARCHAR_Rule1] AS
@InValues IN (N'N', N'A', N'B', N'C')

CREATE RULE [MySchema].[MyTypes_NVARCHAR_Rule1] AS
@InValues IN (N'No Choice', N'Choice A', N'Choice B', N'Choice C')

そして、「Choice A」または「A」から値 1 への変換、「Choice B」または「B」から値 2 への変換などを行います。

以下のスクリプトは、文字列が許容値に変換される場所で実行したい機能に似ています。

CREATE TABLE [MyTable]
( [MyValue] BIT,
  [Description] NVARCHAR(20) )
GO

INSERT INTO [MyTable]
( [MyValue], [Description] )
SELECT 0, 'Enterered as 0' -- false
UNION
SELECT 1, 'Enterered as 1' -- true
UNION
SELECT CAST(0 AS BIT), 'Enterered as CAST(0 AS BIT)' -- false
UNION
SELECT CAST(1 AS BIT), 'Enterered as CAST(1 AS BIT)' -- true
UNION
SELECT CAST('false' AS BIT), 'Enterered as CAST(''false'' AS BIT)' -- false
UNION
SELECT CAST('true' AS BIT), 'Enterered as CAST(''true'' AS BIT)' -- true
4

1 に答える 1

0

いいえ、残念ながらプレーンな T-SQL ではそのようなことはできません。

sql_variant を受け取る CLR ユーザー定義関数を作成し、その中で型テストを行うこともできますが、その必要性については疑問があります。通常、ユーザー インターフェイスで実行されるコードでこの種の変換を行い、データベースはもちろん、ビジネス ロジック層に到達するまでに固定のデータ型を使用できるようにする必要があります。

ちなみに、CREATE RULEは廃止されており、「この機能は将来のバージョンで削除される予定です」という状態が長い間続いています。CHECKこれまでのところ、ユーザー定義型に制約を定義できる代替手段は見たことがありません。それが、実際にはまだ廃止されていない理由の一部かもしれません。

于 2013-03-01T11:55:06.380 に答える