相关疑难解决方法(0)

转换和验证日期字符串的最佳方法

我在存储过程中有一个char(8)变量格式化为ddmmyyyy(此值的质量和有效性未知且超出我的控制范围).将值移动到datetime变量的最有效方法是什么,如果它不是有效的datetime则抛出错误.

DECLARE @Source       char(8)
DECLARE @Destination  datetime

SET @Source='07152009'

--your solution here


SELECT @Destination
Run Code Online (Sandbox Code Playgroud)

这是我能想到的最佳方式:

DECLARE @Source             char(8)
DECLARE @Temp               varchar(10)
DECLARE @Destination        datetime

set @Source='07152009'
SET @Temp=LEFT(@Source,2)+'/'+SUBSTRING(@Source,3,2)+'/'+RIGHT(@Source,4)

IF ISDATE(@Temp)!=1
BEGIN
    RAISERROR('ERROR, invalid date',16,1)
END
SET @Destination=@Temp

SELECT @Source AS Source, @Temp AS  Temp, @Destination AS Destination
Run Code Online (Sandbox Code Playgroud)

编辑这里是我要去的...

DECLARE @Source             char(8)
DECLARE @Destination        datetime

set @Source='07152009'
BEGIN TRY
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)        -- YYYY
                                      +LEFT(@Source,2)        -- MM
                                      +SUBSTRING(@Source,3,2) -- DD
                             )
END TRY
BEGIN CATCH
    PRINT 'ERROR!!!' --I'll add a little …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server sql-server-2005

11
推荐指数
2
解决办法
2万
查看次数

为什么我的CASE表达式不确定?

我试图使用CASE表达式创建一个持久的计算列:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN  [Date]
    ELSE NULL
    END PERSISTED
Run Code Online (Sandbox Code Playgroud)

MSDN清楚地说CASE是确定性的,在这里

但是,我收到一个错误:

消息4936,级别16,状态1,行1"表日历"中的计算列"PreviousDate"无法保留,因为该列是非确定性的.

当然,我可以创建一个标量UDF并明确声明它是确定性的,但是有更简单的方法吗?我已经在获取最新的服务包了.谢谢.

sql sql-server calculated-columns sql-server-2008 persisted-column

6
推荐指数
2
解决办法
4469
查看次数