你可以在SQL Server中使用XML Schema创建一个枚举类型。
例如,颜色。
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 Schema动态创建视图,您可以使用以下查询提取颜色。
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;