【发布时间】:2018-06-27 17:09:03
【问题描述】:
我有一个包含动态 SQL 的存储过程,其中一个参数是多值的。在执行时,我收到以下错误:
错误信息:
“GA”附近的语法不正确。
存储过程:
CREATE PROCEDURE [dbo].[usp_GetRepositoryReturnsGreaterThanZeroTest]
@States varchar(max) = null
AS
Declare @filters varchar(max)
SET @filters = 'Where PaymentAmount > 0'
BEGIN
SET @filters = @filters + ' AND (State in ('''+ @States + '''))'
DECLARE @SQLString varchar(max);
SET @SQLString = 'Select
[ID]
,[State]
From dbo.Bil_ReturnsRepository ' + @filters
EXEC @SQLString
填充参数状态的 C# 代码:
var statesList = "";
foreach (var item in criteria.States)
{ statesList += string.Format("{0} '{1}'", statesList == "" ? "" : ",", item);}
dbCommand.Parameters.Add(new SqlParameter("@States", SqlDbType.VarChar) { Value = statesList });
StatesList 的值:
'GA', 'FL', 'TN'
【问题讨论】:
-
你考虑过表值参数吗?它更安全、更容易、更易于维护。
-
警告! 您的存储过程容易受到 SQL 注入攻击。您最好将其从使用动态 sql 更改为使用表值参数。
-
我想尝试使用示例中显示的当前方法来解决这个问题,因为我头脑清醒,不想放弃尝试解决问题。我还将尝试修改它以使用您对表值参数的建议。我需要对表值参数进行一些研究,以了解如何修改它。谢谢你的建议。
标签: c# sql-server-2012 dynamic-sql