由于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函数,我需要传递什么?
答案 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
...