在SQL Server中使用带有动态查询的datetime

Abb*_*bas 7 sql-server datetime dynamic

嘿伙计们,我正在使用动态查询,其中我想使用保存日期时间的变量,每当我执行查询时它说不能从字符串转换datetime,当我将该变量转换为varchar(max),它将它作为字符串而不是datetime,所以我应该如何执行查询..

下面是我试图执行的SQL查询.

SET @SQL1 = 'SELECT B.FacId, B.FacName, B.BookCode, B.BookName, B.Quantity, 
CONVERT(VARCHAR(10), B.TillDate, 104) AS TILLDATE FROM '+@TABLE+' B
WHERE B.TillDate BETWEEN CONVERT(VARCHAR(10),'+@FROMDATE+', 101) and 
CONVERT(VARCHAR(10), DATEADD(DD,1,'+@TODATE+'), 101)'

EXEC SP_EXECUTESQL @SQL1
Run Code Online (Sandbox Code Playgroud)

这里@fromdate@todatedatetime来自不同的临时表来类型.并存储在这些变量中..

现在应该如何执行此查询..任何建议.请尽快回复......

感谢和问候abbas electricwala.

ble*_*eah 25

你需要引用你的日期..

SET @SQL1 = 
   'SELECT B.FacId, 
           B.FacName, 
           B.BookCode, 
           B.BookName, 
           B.Quantity, 
           CONVERT(VARCHAR(10), B.TillDate, 104) AS TILLDATE 
           FROM '+@TABLE+' B 
           WHERE B.TillDate BETWEEN ''' + CONVERT(VARCHAR(10),@FROMDATE, 101) + ''' and ''' + CONVERT(VARCHAR(10),DATEADD(DD,1,@TODATE), 101) + ''''
Run Code Online (Sandbox Code Playgroud)


Fil*_*Vos 6

您不应该像这样连接您的参数值.最好的解决方案是使用sp_executesql参数化查询.

DECLARE @sql nvarchar(4000)

select @sql = N'
  SELECT B.FacId 
       , B.FacName
       , B.BookCode
       , B.BookName
       , B.Quantity
       , CONVERT(VARCHAR(10), B.TillDate, 104) AS TILLDATE 
    FROM ' + quotename(@TABLE) + N' B
   WHERE B.TillDate BETWEEN cast(floor(cast(@fromDate as float)) as datetime)
                        AND cast(floor(cast(@toDate as float)) as datetime)'

EXEC sp_executesql @sql, N'@fromDate datetime, @toDate datetime', @FROMDATE, @TODATE
Run Code Online (Sandbox Code Playgroud)

有关sp_executesql的注意事项是:

  • 参数是NVARCHAR
  • 第3个和第4个参数保留其原始数据类型,不需要转换为varchar.这再次保护了SQL注入,它使查询更具可读性,因为您可以防止在动态SQL中常见的引用汤

对查询应用了一些其他更改:

  • 表名包含在QUOTENAME()防止对象名称上的sql注入的函数中
  • 删除日期时间变量的日期部分的方式不是很理想.做一个convert(,,101)昂贵的操作,可以更好地使用铸件漂浮和取得该值的地板.