我的SQL存储过程中有一行看起来像这样(按预期工作):
HAVING oh.startdate BETWEEN @startDate AND @endDate
然而,在更远的地方,我有一条线:
AND (oh.user IN (@userIDs))
其中@userID是一个逗号分隔的ID字符串,oh.user是一个INTEGER,所以我必须将整个SQL查询放入一个动态字符串(@SQL)中,并将所有参数连接到其中,然后使用
sp_executesql @sql
除了BETWEEN日期外,一切都很好,我尝试了几种方法,在应该出现错误或没有结果的情况下不断出现错误:
HAVING oh.startdate BETWEEN CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+', 120) AND CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+', 120)
不返回任何内容。
HAVING oh.startdate '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+' AND '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+'
也不返回任何内容。
HAVING oh.startdate BETWEEN ' + @startDate +' AND '+ @endDate +'
返回将DATETIME转换为字符串时出错。
感谢您的帮助。
谢谢,Thomas
您可以使用sp_executesql
并传递您想要的参数:
SET @sql = 'SELECT blabla FROM Table WHERE Something HAVING oh.startdate BETWEEN @startDate AND @endDate'
EXEC sp_executesql @sql,N'@startDate DATE, @EndDate DATE',@startDate, @EndDate
试试这个:
HAVING oh.startdate BETWEEN to_date(@startDate,'dd-MM-yyyy') AND to_date(@endDate,'dd-MM-yyyy')
并更改"dd-MM-yyyy"以适应您使用的日期格式。