为自定义数据类型创建隐式转换规则

时间:2017-06-12 09:01:14

标签: sql-server sql-server-2008-r2 implicit-conversion user-defined-types

我正在为我们的客户编写一堆SQL来输出.xml文件。他们更愿意拥有" Y"或" N"在BIT列中,而不是1或0.我们在整个地方都有很多BIT列,我需要写CASE WHEN 1 THEN 'Y' ELSE 'N' END次,而不是我吃晚餐,以转换数据。

从某种意义上说,那很好,我应该继续使用它并停止呻吟,但我无法想知道......如果我从CHAR(1)基础创建了一个自定义数据类型,只允许" Y"或" N"值,我可以以某种方式为隐式转换制定规则,以便机器可靠地为我做转换 - 将1转换为" Y"和0到" N"每一次?

我意识到还有其他可能性来实现同样的事情(例如,使用.xsd在事件之后转换为具有Y / N而不是1/0),但我对添加自定义感兴趣类型和规则 - 它是否可能并且它是否合理?

1 个答案:

答案 0 :(得分:0)

有 - AFAIK - 无法掌握这些内部流程。

从我提出的问题来看,您正在编写一个XML文件,所以我假设您希望XML文件中的书面信函能够提高人类的可读性?如果是这样,最好试着说服你的员工,01没有错。

但是你可以节省一些打字:

 CREATE FUNCTION dbo.WriteBit(@b BIT) RETURNS VARCHAR(1)
 AS BEGIN
    RETURN
    (
    SELECT CASE @b WHEN 1 THEN 'Y'
                   WHEN 0 THEN 'N'
                   ELSE NULL END
    ); 
 END;
 GO

DECLARE @mockup TABLE(SomeInt INT, SomeBit BIT);
INSERT INTO @mockup VALUES
 (0,0)
,(1,1);

SELECT SomeInt,dbo.WriteBit(SomeBit) AS SomeBitChar FROM @mockup;

SELECT SomeInt,dbo.WriteBit(SomeBit) AS SomeBitChar 
FROM @mockup
FOR XML PATH('test'),ROOT('root');
GO

DROP FUNCTION dbo.WriteBit;
GO

XML中的结果

<root>
  <test>
    <SomeInt>0</SomeInt>
    <SomeBitChar>N</SomeBitChar>
  </test>
  <test>
    <SomeInt>1</SomeInt>
    <SomeBitChar>Y</SomeBitChar>
  </test>
</root>