【问题标题】:IN clause has parameter doesn't work in stored procedureIN 子句有参数在存储过程中不起作用
【发布时间】:2018-07-27 03:57:26
【问题描述】:

我在存储过程中有“Name IN (@NameList))”作为条件之一。

参数声明为@NameList varchar(100) = ''

当我使用 EXEC myProc @NameList='''a''' 之类的字符串执行程序时 该过程不返回任何内容,但是当我将参数替换为像'a' 这样的硬编码值时,它成功了。

我在 SP 中放了一条 PRINT 语句,它准确地打印出 'a'

这里有什么问题?

谢谢,

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 问题是 IN 子句需要一个 值列表 进行检查,但您只提供了一个 单个字符串输入。
  • @marc_s IN 语句将使用单个值。例如,('ralph')中的用户名可以正常工作。不是你应该,但你可以。
  • @marc_s 虽然我同意,但如果 Lys 将此方法用于逗号分隔的列表,它将不起作用,因为逗号将是字符串的一部分,将会失败。
  • 看来您正在朝着这一点前进,所以我现在提供这个建议。解决希望将多个值传递给 SQL Server 的问题的最佳方法是使用 设计 类型来保存多个值(理想情况下,表值参数。不太理想的是 XML 或 JSON)。您正在将 yourself 推入这个问题,而是尝试在 string 中传递多个值。

标签: tsql stored-procedures sql-server-2017


【解决方案1】:

也请阅读我的 cmets,但一种解决方案是将逗号分隔的字符串拆分为一个表格,然后加入该表格:

   declare @list varchar(max) = '13,14,15,13,14,15,13'

   SELECT
      LTRIM(RTRIM(a.b.value('.[1]','VARCHAR(255)'))) Parish
   FROM
     (
      SELECT CAST('<XMLRoot><RowData>' +  REPLACE(@list,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) x)t 
      CROSS APPLY x.nodes('/XMLRoot/RowData')a(b)

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2018-08-10
    • 2012-12-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2014-05-24
    相关资源
    最近更新 更多