【问题标题】:Using a list from a @variable in a where statement在 where 语句中使用来自 @variable 的列表
【发布时间】:2021-02-10 14:18:03
【问题描述】:

我正在尝试在 where 语句中使用从其他地方传递的变量中的值,但我在语法上苦苦挣扎。

我有一个正在传递的字段,其中的值本质上是一个列表

即@Var1,其中传递的值为AA','BB','CC(即缺少前导'和尾随'

我想在我的 where 语句中使用这个值作为一个列表,例如

where 
field1 IN @Var1

ie - 我想要的实际结果是

where
field1 IN ('AA','BB','CC')

我无法控制正在传递的内容(即 AA'、'BB'、'CC 将始终缺少前导和尾随',那么我如何在在哪里?

我似乎遇到了围绕使用 '

的语法问题

我希望这是有道理的,这不是最容易解释的事情,而且对我来说仍然相对较新

【问题讨论】:

  • 为了清楚起见,变量中的值每次用户选择的东西都​​可能不同 - 例如可能是 AA'、'BB'、'CC 一次,然后是 EE'、' FF','AA 下一次但每次第一个代码都缺少开头 ' 并且最后一个代码缺少结尾 '
  • 不要为此使用标量变量,顾名思义,它们具有标量值。使用表值类型。
  • 这能回答你的问题吗? SQL Server - In clause with a declared variable
  • 上帝接受的答案太糟糕了,@GSerg ...这是注射的噩梦。
  • “本质上是一个列表”——不,不是。这是一个恰好包含一些逗号的字符串。我知道没有一种语言会采用这样的值,作为单个参数提供,然后突然决定将其解释为多个参数。您应该使用 设计的类型 来保存多个值,例如表变量,或者如果不是,则使用 XML 或 JSON。

标签: sql sql-server variables where-clause in-clause


【解决方案1】:

这是我在上述 cmets 中的方法的示例:

CREATE PROCEDURE test_r(@x varchar(4000))
AS
BEGIN
  DECLARE @t TABLE (keys NVARCHAR(10))

  DECLARE @sql_xml XML = CAST('<root><X>'+REPLACE(@x, char(39)+','+char(39), '</X><X>') + '</X></root>' AS XML)

  INSERT INTO @t(keys)
    SELECT f.x.value('.', 'VARCHAR(10)') AS y
      FROM @sql_xml.nodes('/root/X') f(x)
 
   SELECT *
      -- FROM [MyTable] m INNER JOIN...
     FROM @t
END
GO

DECLARE @x AS nvarchar(4000) = 'AA' + char(39) + ',' + char(39) + 'BB' + char(39) + ',' + char(39) + 'CC'
EXEC test_r @x

根据您对查询结果的处理方式,您可能希望创建一个函数而不是一个过程。

【讨论】:

  • STRING_SPLITOPENJSON 有什么问题?
  • @Charlieface 我想这没什么问题 - 除了据我所知STRING_SPLIT 在 SQL Server 上的所有版本中都不受支持。 OPENJSON 也可以工作 - 我更熟悉 XML,因此 XML 的示例...
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 2021-01-30
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多