SQL Server 2008将数据类型作为函数的参数传递

时间:2018-11-13 10:14:52

标签: sql-server tsql sql-server-2008

由于SQL Server 2008没有Try_convert函数,因此我想实现它以在Project中使用。 (不能仅将其更新为最新版本)

问题是:如何将数据类型作为参数传递给函数?

更通用:变量必须具有哪种条目类型才能保存数据类型?

基本上我想构建一个像这样的函数:

CREATE FUNCTION my_Try_Convert
(
    -- Add the parameters for the function here
    @value varchar(max),@entrytype type,
    @format int = NULL  
)
RETURNS typeof(@entrytype)
AS
BEGIN
    if @entrytype = typeof(datetime)
        if (select  ISDATE(@value))=1
            return convert(@entrytype,@value,@format)
    if @entrytype = typeof(int)     
        if (select  isnumeric(@value))=1
            return convert(@entrytype,@value,Null)
END
GO

对于@entrytypes类型和typeOf psyodo函数,我需要传递什么?

1 个答案:

答案 0 :(得分:1)

好吧,SQL-Server 2008中没有TRY_CONVERT()TRY_CAST(),但是您可以使用XML的内部强制类型转换为可空类型。

尝试一下

DECLARE @tbl TABLE(SomeInt VARCHAR(100));
INSERT INTO @tbl VALUES('123')
                      ,('blah') --bad data
SELECT t.*
      ,CAST('' AS XML).value('sql:column("t.SomeInt") cast as xs:int?','int')
FROM @tbl t;

有点骇人听闻...但是某种程度上很漂亮;-)

有些夸张

CAST('' AS XML)只是获得真实XML 以便使用XML的本机方法的一种技巧。 sql:column()是一种XQuery函数,它允许您将集合的列包含在XQuery中(对变量使用sql:variable)。

cast as xs:int?将尝试将字符串解析为int值,如果不起作用,则将返回NULL。

限制是:这将始终使用系统的默认值(类似于TRY_CAST)。使用TRY_CONVERT,您可以通过第三个参数来更好地控制输出...

提示:XQuery/Xpath严格区分大小写。所以有xs:dateTime?,但是您会遇到xs:datetime ...

错误