【问题标题】:SQL Server 2008 passing datatype as parameter for functionSQL Server 2008 将数据类型作为函数的参数传递
【发布时间】:2018-11-13 10:14:52
【问题描述】:

由于 SQL Server 2008 没有 Try_convert 函数,我想实现它以在我的项目中使用。 (不是简单地更新到更新的版本不是一种选择)

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

或者

更通用:变量需要什么条目类型才能保存数据类型?

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

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 函数需要传递什么?

【问题讨论】:

  • 不能像这样在 T-SQL 中完成。 T-SQL 没有可以容纳数据类型的数据类型。
  • 这里的另一个问题是像ISNUMERIC 这样的函数不是很好。例如尝试ISNUMERIC('.'),然后尝试CONVERT(int,'.') 或CONVERT(decimal(2,1),'.')。请注意,两个转换都失败了,但 ISNUMERIC 返回 true。
  • 你需要创建一个 CLR 函数才能在你的 2008 中工作。

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


【解决方案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-value,如果这不起作用,将返回 NULL。

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

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

【讨论】:

  • 确实很漂亮:-)
猜你喜欢
  • 2023-03-22
  • 2018-01-04
  • 1970-01-01
  • 2022-10-06
  • 2014-08-21
  • 1970-01-01
  • 2019-03-05
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多