在SQL Server动态查询中从字符串到日期时间的转换失败

时间:2018-09-20 11:42:05

标签: sql sql-server dynamic

我面临着转换为日期时间的问题。

DECLARE @sql nvarchar(max)
DECLARE @Lastdate datetime
SET @Update = N'    
                        SELECT TOP 1 
                            '+@Lastdate+' = Purchase.LastUpdated
                        FROM    Purchase
                        WHERE   ID = 15                         
                    '

LastUpdated也是数据库中的日期时间格式

那为什么它不能转换

  

我只想使用sp_executesql将datetime设置为来自purchase.lastupdate的声明变量@LastDate

2 个答案:

答案 0 :(得分:2)

这是使用@LastUpdated设置sp_executesql的值的另一种可能的方法:

-- Declaration
DECLARE @sql nvarchar(max)
DECLARE @LastUpdated datetime
DECLARE @err int

-- Statement
SET @sql = N'
    SELECT TOP 1 @LastUpdated = Purchase.LastUpdated
    FROM Purchase
    WHERE ID = 15
'
-- Execution
EXEC @err = sp_executesql 
    @sql,
    N'@LastUpdated datetime OUTPUT',
    @LastUpdated OUTPUT

-- Test output
IF @err = 0 
   PRINT @LastUpdated
ELSE 
   PRINT 'Error'

答案 1 :(得分:1)

如果您尝试传递恒定值,请使用sp_executesql。您的查询似乎并不真正有用。这似乎是一个合理的近似值:

DECLARE @LastUpdated datetime;
SET @Update = N'    
SELECT TOP 1 @LastUpdated as LastUpdated
FROM    Purchase
WHERE   ID = 15';

EXEC sp_executesql @Update,
                   N'@LastUpdated datetime',
                   @LastUpdated=@LastUpdated;  

编辑:

要更新数据,您需要使用UPDATE。但是您不需要动态SQL:

UPDATE Purchase
    SET LastUpdated = @LastUpdated
    WHERE ID = 15;

如果ID不是唯一的,并且您希望将其限制为一(任意)行:

UPDATE p
    SET LastUpdated = @LastUpdated
    FROM (SELECT TOP (1)
          FROM Purchase
         ) p
    WHERE ID = 15;

您应该将ORDER BYTOP一起使用,以便可以控制要影响的行。