【发布时间】:2016-07-21 13:32:28
【问题描述】:
这是我的存储过程
ALTER PROCEDURE [dbo].[sp_ListFirmJobFilter]
(@Status as nvarchar(10),
@CityID as nvarchar(10),
@DataStart as date,
@DataEnd as date,
@FirmID as nvarchar(10)
)
AS
BEGIN
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = N'SELECT * FROM Jobs WHERE 1=1'
IF @Status IS NOT NULL
BEGIN
SET @Sql += ' AND Status = '+@Status+''
END
IF @CityID IS NOT NULL
BEGIN
SET @Sql += ' AND CityID = '+@CityID+''
END
IF @FirmID IS NOT NULL
BEGIN
SET @Sql += ' AND FirmID = '+@FirmID+' '
END
IF @DataStart IS NOT NULL
BEGIN
SET @Sql += ' AND (InsertedDate >= ' + CONVERT(VARCHAR(50), @DataStart)
SET @Sql += ' AND InsertedDate <= ' + CONVERT(VARCHAR(50), @DataEnd)
SET @Sql += ')'
END
PRINT(@Sql)
EXEC(@Sql)
END
命令成功完成。
但是当我使用那个参数执行那个存储过程时
DECLARE @return_value int
EXEC @return_value = [dbo].[sp_ListFirmJobFilter]
@Status = NULL,
@CityID = null,
@DataStart = N'2016-06-26',
@DataEnd = N'2016-06-28',
@FirmID = 4
SELECT 'Return Value' = @return_value
GO
我收到一个错误:
操作数类型冲突:日期与 int 不兼容
我寻找已执行的 SQL 命令(打印 SQL 字符串)。这是执行命令:
SELECT *
FROM Jobs
WHERE 1=1
AND FirmID = 4
AND (InsertedDate >= 2016-06-26 AND InsertedDate <= 2016-06-28)
当我执行它时,它给出了同样的错误。我把它改成:
SELECT *
FROM Jobs
WHERE 1=1
AND FirmID = 4
AND (InsertedDate >= '2016-06-26' AND InsertedDate <= '2016-06-28')
这行得通。
我该怎么办? InsertedDate 类型为日期
【问题讨论】:
-
首先,您的程序对 sql 注入是开放的。你永远不应该直接执行这样收到的值。这是处理此类查询的更好方法。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries 另外,您确实应该考虑删除 sp_ 前缀(或者甚至更好地完全删除前缀)。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix
标签: sql sql-server stored-procedures