Ras*_*man 2 sql-server t-sql sql-server-2008-r2
我正在尝试将销售日期 >= 的所有数据提取到某个日期时间。当我执行查询时,出现以下错误:
消息 241,级别 16,状态 1,第 15 行
从字符串转换日期和/或时间时转换失败。
我应该改变什么才能让他的查询运行?下面是示例 DDL
Declare @datetime datetime = GetDate(), @sql varchar(max)
Create Table #dinonuggets
(
saledate datetime
,item varchar(500)
)
Insert Into #dinonuggets Values
('2016-03-30 12:02:00.000','chair')
,('2016-03-04 08:12:48.000','stove')
,('2016-03-07 09:37:39.000','washer')
Set @sql = 'Select * FROM #dinonuggets WHERE saledate >= '+@datetime+' '
Print @sql
Exec (@sql)
Run Code Online (Sandbox Code Playgroud)
我的预期输出将是
03/30/2016 12:02:00.000 椅子,
因为这是唯一符合标准的数据
AMt*_*two 11
您的问题与您构建动态 SQL 的方式有关。如果您查看 PRINT 语句的输出,您的@datetime. 此外,从动态 SQL 中的 #temp 表中选择不会做你想要它做的事情。#dynonuggets将超出您的动态 SQL 的范围。如果您确实需要使用动态表,则需要创建一个名为的全局临时表##dynonuggets。
我假设,DynoNuggets是一个真正的表,你必须使用动态 SQL,你的例子只是针对你的问题进行了简化。
您可以添加引号,但更合适的解决方案是使用 sp_executesql 来参数化您的动态 SQL。
尝试这个:
DECLARE @datetime datetime = GETDATE(),
@sql nvarchar(max),
@params nvarchar(1000)
CREATE TABLE DinoNuggets
(
saledate datetime
,item varchar(500)
)
INSERT INTO DinoNuggets VALUES
('2016-03-30 12:02:00.000','chair')
,('2016-03-04 08:12:48.000','stove')
,('2016-03-07 09:37:39.000','washer')
SET @sql = N'SELECT * FROM DinoNuggets WHERE saledate >= @ParamValue';
SET @Params = N'@ParamValue datetime';
PRINT @sql;
EXEC sp_executesql @sql, @params, @ParamValue = @datetime
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10039 次 |
| 最近记录: |