sql-server – 不使用CLR创建数据库级常量(枚举)?

我有几个SQL对象需要根据所需的请求状态采取替代操作.有没有办法创建数据库级常量(枚举),可以传递给存储过程,表值函数,并在查询中使用(不使用CLR)?

CREATE PROCEDURE dbo.DoSomeWork(@param1 INTEGER, ..., @EnumValue myEnumType)  AS ...;

然后使用它:

EXEC doSomeWork 85, ..., (myEnumType.EnumValue1 + myEnumType.EnumValue2);

其中myEnumType将包含一些枚举值.

在该过程中,我将能够使用@EnumValue并根据myEnumType中的值对其进行测试,以执行所需的工作.对于我正在考虑的情况,我会将myEnumType的值设为位掩码.

举一个简单的例子,考虑一个昂贵的过程,它需要一个庞大的数据集并将其减少到一个较小但仍然非常大的数据集.在此过程中,您需要在该过程的中间进行一些调整,这将影响结果.假设这是基于减少中的中间计算的某些状态来过滤(或反对)某些类型的记录.可以使用myEnumType类型的@EnumValue来测试它

SELECT   ...
FROM     ...
WHERE       (@EnumValue & myEnumType.EnumValue1 = myEnumType.EnumValue1 AND ...)
        OR  (@EnumValue & myEnumType.EnumValue2 = myEnumType.EnumValue2 AND ...)
        OR  ...

在不使用CLR的情况下,SQL Server中是否可以使用这些数据库级常量?

我正在寻找一个数据库级枚举或一组常量,可以作为参数传递给存储过程,函数等.

最佳答案
您可以使用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;

转载注明原文:sql-server – 不使用CLR创建数据库级常量(枚举)? - 代码日志