【问题标题】:Dynamic SQL error for multivalued parameter多值参数的动态 SQL 错误
【发布时间】: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


【解决方案1】:

乍一看,我会说这条线

'''+ @States + '''

搞砸了,因为这 - 在你的例子中 - 会导致

''GA', 'FL', 'TN''

尝试删除'''

【讨论】:

  • 如果@States 包含'GL')';Drop table Bil_ReturnsRepository;--,你认为会发生什么?
  • 是的,代码注入可能是个问题,但这是另一个话题! ;-)
  • 没有。它不是。通过帮助 OP 来“解决”以错误方式做事而造成的问题,你并没有帮助任何人。如果你知道你的代码有问题,你至少可以在你的答案中写出来。
  • 问题是,为什么会抛出不正确的语法错误!通常你是一步一步学习的,所以如果第一种方法是将参数作为字符串传递,那就这样吧!重新设计表值参数等将是第二种方法。另一方面,您对代码注入的评论不会回答原始帖子,因为在表值参数中包含 ''' 的字符串也会导致错误!
  • 我不同意。正如我之前写的那样,帮助某人做错事根本没有帮助。如果你去看医生治疗你的头部疼痛,医生只会给你一颗阿司匹林,而他应该用青霉素治疗感染,你会说这有帮助吗?没有更多的痛苦,当然,但疾病仍然存在......
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 2019-02-03
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多