【发布时间】:2020-02-19 20:46:46
【问题描述】:
我有一个 SQL Server 表,其中包含一些基本的销售信息,如下所示
SaleID | TotalValue | PaymentMethod | User | Date
--------|---------------|-------------------|-----------|--------------
1 | 10 | CASH | USER 1 | 2020-01-01
2 | 120 | DEBIT CARD | USER 2 | 2020-01-01
3 | 1000 | CREDIT CARD | USER 2 | 2020-01-01
4 | 305 | CREDIT CARD | USER 1 | 2020-01-01
5 | 15 | CASH | USER 5 | 2020-01-01
我需要编写一个动态过程操作系统,它能够使用 SaleID 数组作为过滤器来搜索销售信息。这是一个简单的选择查询,如下:
SELECT
[SaleID]
,[TotalValue] as 'Total Value'
,[Date] as 'Date'
FROM
[Sales]
WHERE
[SaleID] in (1, 2, 3, 4)
我创建了以下存储过程,因此我可以输入一个 SalesID 数组:
CREATE PROCEDURE [dbo].[usp_SearchSales]
(
@SaleID NVARCHAR(max)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX)
DECLARE @ParameterDef NVARCHAR(500)
SET @ParameterDef = '@SaleID NVARCHAR(max)'
SET @SQL = 'SELECT
[SaleID]
,[TotalValue]
,[PaymentMethod]
,[User]
,[Date]
FROM
[Sales]
WHERE
-1=-1'
IF @SaleID IS NOT NULL
SET @SQL = @SQL+ ' AND SaleID in (@SaleID)'
EXEC sp_Executesql @SQL, @ParameterDef, @SaleID = @SaleID
END
GO
然后我通过Exec命令执行Procedure
EXEC [usp_SearchSales] @SaleID = '1, 2, 3, 4'
GO
然后程序在执行时返回以下错误:
消息 245,级别 16,状态 1,过程 usp_SearchSales,第 26 行 [批处理开始第 49 行]
将 nvarchar 值 '1, 2, 3, 4' 转换为数据类型 int 时转换失败。
这是一个 SQL 查询,用于在设计的表上创建和插入一些值
CREATE TABLE [Sales] (
[SaleID] int,
[TotalValue] float,
[PaymentMethod] varchar(50),
[User] varchar(50),
[Date] date
)
insert into sales values (1, 10, 'CASH', 'USER 1', '2020-01-01')
insert into sales values (2, 120, 'DEBIT CARD', 'USER 2', '2020-01-01')
insert into sales values (3, 10000, 'CREDIT CARD', 'USER 2', '2020-01-01')
insert into sales values (4, 305, 'CREDIT CARD', 'USER 1', '2020-01-01')
insert into sales values (5, 15, 'CASH', 'USER 5', '2020-01-01')
我需要一些帮助来创建一个过程,或者类似的东西,其中一个 SalesID 数组将这些销售的销售信息返回给我。
【问题讨论】:
-
这一行
SET @SQL = @SQL+ ' AND SaleID in (@SaleID)'应该是SET @SQL = @SQL+ ' AND SaleID in (' + @SaleID + ')'即你需要将传入的 id 添加到动态 SQL,而不是引用变量。 -
这是一种相当复杂的方法,但它确实有效,谢谢@EricBrandt!!
-
感谢@DaleK,这实际上解决了这个问题。我确实尝试过这种方法,但是我在编写查询时一定犯了一个错误,因为它不起作用你的工作正常,谢谢!!!
-
需要明确的是,这不是最好的方法,它会让你对 SQL 注入持开放态度。请参阅下面的答案。
标签: sql sql-server tsql dynamic-sql dynamicquery