向存储过程传递多个值

6
以下是在SQL Server中正确运行以下内容的方法:

什么是在SQL Server中运行以下内容的正确方法?

Execute myStore @dept='dept1',@dept='dept2'

或者
Execute myStore @dept in ('dept1','dept2')
1个回答

8

您可以参考文章。有以下5种方法可以实现:

方法一 - 将CSV字符串列表作为参数传递给(N)VARCHAR数据类型参数,然后在SP或UDF内部拆分/解析它,在这里查看

方法二 - 将XML字符串作为XML数据类型参数传递。我们需要在SP内解析XML,在这里查看

方法三 - 在执行SP之前,在外部创建一个临时表。这里不需要传递任何参数给SP,在这里查看

方法四 - 使用TVPs:使用SQL Server 2008及以上版本,您可以创建TVPs或表值参数,并通过使用用户定义的表类型来声明它们。这些TVPs可用于将多行数据发送到SP或UDF中,而无需创建临时表或多个参数,在这里查看

方法五 - 将JSON字符串作为NVARCHAR数据类型参数传递。我们需要在SP内解析JSON,在这里查看

例如,来自链接源的方法1示例:
-- As always I will use the AdventureWorks database<img width="16" height="16" class="wp-smiley emoji" draggable="false" alt=":)" src="https://s1.wp.com/wp-content/mu-plugins/wpcom-smileys/simple-smile.svg" style="height: 1em; max-height: 1em;">
USE [AdventureWorks2012]
GO

-- Create an SP with NVARCHAR(MAX) parameter:
CREATE PROCEDURE uspGetPersonDetailsCSV (
    @persons NVARCHAR(MAX)
)
AS
BEGIN
    --DECLARE @persons NVARCHAR(MAX)
    --SET @persons = 'Charles,Jade,Jim,Luke,Ken'

    SELECT T.C.value('.', 'NVARCHAR(100)') AS [Name]
    INTO #tblPersons
    FROM (SELECT CAST ('<Name>' + REPLACE(@persons, ',', '</Name><Name>') + '</Name>' AS XML) AS [Names]) AS A
    CROSS APPLY Names.nodes('/Name') as T(C)

    SELECT BusinessEntityID, Title, FirstName, MiddleName, LastName, ModifiedDate
    FROM [Person].[Person] PER
    WHERE EXISTS (SELECT Name FROM #tblPersons tmp WHERE tmp.Name  = PER.FirstName)
    ORDER BY FirstName, LastName

    DROP TABLE #tblPersons
END
GO

-- No execute this SP by passing a list of values comma separated as a single string:
EXEC uspGetPersonDetailsCSV 'Charles,Jade,Jim,Luke,Ken'
GO
-- Check the output, objective achieved<img width="16" height="16" class="wp-smiley emoji" draggable="false" alt=":)" src="https://s1.wp.com/wp-content/mu-plugins/wpcom-smileys/simple-smile.svg" style="height: 1em; max-height: 1em;">

-- Final Cleanup
DROP PROCEDURE uspGetPersonDetailsCSV
GO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接