XMLスキーマを使用して、SQL Serverで列挙型を作成できます。
たとえば、色。
create xml schema collection ColorsEnum as '
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Color">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Red"/>
<xs:enumeration value="Green"/>
<xs:enumeration value="Blue"/>
<xs:enumeration value="Yellow"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>';
これにより、タイプの変数またはパラメータを使用できますxml(dbo.ColorsEnum)
。
declare @Colors xml(dbo.ColorsEnum);
set @Colors = '<Color>Red</Color><Color>Green</Color>'
色ではないものを追加しようとすると
set @Colors = '<Color>Red</Color><Color>Ferrari</Color>';
エラーが発生します。
Msg 6926, Level 16, State 1, Line 43
XML Validation: Invalid simple type value: 'Ferrari'. Location: /*:Color[2]
このようなXMLの作成は少し面倒な場合があるため、たとえば、許可された値も保持するヘルパービューを作成できます。
create view dbo.ColorsConst as
select cast('<Color>Red</Color>' as varchar(100)) as Red,
cast('<Color>Green</Color>' as varchar(100)) as Green,
cast('<Color>Blue</Color>' as varchar(100)) as Blue,
cast('<Color>Yellow</Color>' as varchar(100)) as Yellow;
このように使用して、列挙を作成します。
set @Colors = (select Red+Blue+Green from dbo.ColorsConst);
XMLスキーマから動的にビューを作成する場合は、このクエリで色を抽出できます。
select C.Name
from (select xml_schema_namespace('dbo','ColorsEnum')) as T(X)
cross apply T.X.nodes('//*:enumeration') as E(X)
cross apply (select E.X.value('@value', 'varchar(100)')) as C(Name);
列挙型はもちろん関数やプロシージャのパラメータとしても使用できます。
create function dbo.ColorsToString(@Colors xml(ColorsEnum))
returns varchar(100)
as
begin
declare @T table(Color varchar(100));
insert into @T(Color)
select C.X.value('.', 'varchar(100)')
from @Colors.nodes('Color') as C(X);
return stuff((select ','+T.Color
from @T as T
for xml path('')), 1, 1, '');
end
create procedure dbo.GetColors
@Colors xml(ColorsEnum)
as
select C.X.value('.', 'varchar(100)') as Color
from @Colors.nodes('Color') as C(X);
declare @Colors xml(ColorsEnum) = '
<Color>Red</Color>
<Color>Blue</Color>
';
select dbo.ColorsToString(@Colors);
set @Colors = (select Red+Blue+Green from dbo.ColorsConst);
exec dbo.GetColors @Colors;