【问题标题】:Pass csv of ints to Stored proc and use for IN() [duplicate]将整数的 csv 传递给存储过程并用于 IN() [重复]
【发布时间】:2016-10-06 08:22:18
【问题描述】:

我想传递一个 int 的 csv

1,2,3,4,5,6,7

到一个存储过程,以便我可以在 IN() 中使用传入的值,以便

IN(1,2,3,4,5,6,7)

这可能吗?

【问题讨论】:

  • 所以 CSV 总是会有 1 行的值?
  • 您可以使用动态 sql 或标记答案中指出的拆分函数。拆分时,您可以加入存储拆分值的表,或in (select value from splitValues)
  • 你也可以看看这里。标记的答案是使用递归 cte,它工作得很好,但效率很低。这里有一些更好的选择。 sqlperformance.com/2012/07/t-sql-queries/split-strings
  • 你真正想做的是传入一个表值参数。

标签: sql-server


【解决方案1】:

以防万一您只是想为您的 SQL 使用动态参数:

CREATE PROCEDURE [dbo].[takeMeAndMySeeEzzBee]
    @csv VARCHAR(30)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(255)
    SET @sql = 'SELECT THIS_AND_THAT FROM HERE WHERE YOU_ARE IN(' + @csv + ')'

    EXEC sp_executesql @sql
END;
GO
-- I will runawayyyy
EXEC [dbo].[takeMeAndMySeeEzzBee] @csv='1,2,3,4'

^ 是动态 SQL 如何工作的示例。

现在,如果您想从.csv 文件中提取数据,请告诉我们;我的答案会改变。

【讨论】:

  • 不错!可能只会出现一个问题 - 它需要特殊权限才能执行“sp_executesql”,但这对 OP 来说可能不是问题 :) 这是我的问题
【解决方案2】:

您可以使用 XML:

CREATE PROCEDURE dbo.MyProcName
    @csv nvarchar(max)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @xml xml

    SELECT @xml = CAST('<a>' + REPLACE(@csv,',','</a><a>') +'</a>' as xml)

    SELECT what_you_need
    FROM some_table s
    INNER JOIN (
        SELECT t.v.value('.','int') as something
        FROM @xml.nodes('/a') as t(v)
        ) as p
        ON p.something = s.something
END

或者:

SELECT what_you_need
FROM some_table s
WHERE s.something IN (
    SELECT t.v.value('.','int') as something
    FROM @xml.nodes('/a') as t(v)
    ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2021-12-23
    相关资源
    最近更新 更多