【发布时间】:2016-09-30 11:33:03
【问题描述】:
我在使用存储过程时遇到错误。 下面是存储过程的代码:
ALTER PROCEDURE [dbo].[usp_specificorderchangedhistory]
-- Add the parameters for the stored procedure here
@startRowIndex int,
@maximumRows int,
@OrderDate datetime= null
AS
BEGIN
DECLARE @first int,@last int
SET @first = @startRowIndex * @maximumRows
SET @last = (@startRowIndex * @maximumRows) + @maximumRows
declare @sql varchar(max)
declare @sqlcnt varchar(max)
declare @cond varchar(max)
if @OrderDate is not null
begin
set @cond = ' and convert(varchar,so.OrderDate,101) ='+convert(varchar,@OrderDate,101)+' '
end
print @cond
set @sql= 'SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY so.OrderID DESC) AS Row,
so.OrderID,
u1.Firstname+' + ''' ''' + '+u1.Lastname as Username,
U.Firstname as CustomerName,
so.OrderNumber,
so.TotalAmount,
so.Status,
so.OrderDate,
so.Comment,
p.PaymentMode as PaymentMethod,
p.PaymentMethod as Payment_Mode,
p.IsPaid
FROM SpecificOrders AS so
INNER join Users as U on so.UserID = U.UserID
INNER join Users as u1 on so.CreatedBy = u1.UserID
INNER join SpecificOrderPayment as p on so.OrderID= p.OrderID
'+ @cond +'
) spec
WHERE Row>'+Convert(Varchar,@first )+' AND
Row<='+Convert(Varchar,@last)
print @sql
exec(@sql)
set @sqlcnt= 'SELECT count(*) FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY so.OrderID DESC) AS Row
FROM SpecificOrders AS so
INNER join Users as U on so.UserID = U.UserID
INNER join Users as u1 on so.CreatedBy = u1.UserID
INNER join SpecificOrderPayment as p on so.OrderID= p.OrderID
'+ @cond +'
) spec'
exec(@sqlcnt)
end
当我使用以下查询执行存储过程时:
EXEC usp_specificorderchangedhistory '08/20/2016'
得到错误:
Conversion failed when converting the varchar value '29/09/2016' to data type int.
虽然,我尝试使用
运行相同的查询没有存储过程选择
查询。它的工作原理完全符合要求:下面是选择查询:
select * as Dateorder
from SpecificOrders as s
inner join SpecificOrderPayment as p
on s.OrderID = p.OrderID
where convert(varchar,s.orderdate,101) =convert(varchar,'08/20/2016',101)
谢谢
【问题讨论】:
-
您为什么要通过将日期转换为 varchars 来比较日期?
-
我也直接试了,没用
-
SQL Server 理解格式
MM/DD/YYYorYYYY/MM/DD -
ya 在我的数据库中,日期以类似“2016-08-20 14:54:36.363”的形式保存,而在查询中,“=”右侧的形式为“08/20” /2016'
-
你的问题应该解释为什么你不应该对查询参数使用字符串连接。您可以避免 SQL 注入 和 转换问题。由于这两个值都是
datetime,因此您不需要任何转换。只需使用' and so.OrderDate= @someDate ', usesp_executesql` 执行最终查询并将@OrderDate的值作为someDate参数传递
标签: sql-server datetime stored-procedures