我正在为我们的客户编写一堆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),但我对添加自定义感兴趣类型和规则 - 它是否可能并且它是否合理?
答案 0 :(得分:0)
有 - AFAIK - 无法掌握这些内部流程。
从我提出的问题来看,您正在编写一个XML文件,所以我假设您希望XML文件中的书面信函能够提高人类的可读性?如果是这样,最好试着说服你的员工,0
和1
没有错。
但是你可以节省一些打字:
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>