从 Select 语句为变量设置超过 1 个值

Posted

技术标签:

【中文标题】从 Select 语句为变量设置超过 1 个值【英文标题】:Set more than 1 value to variable from Select statement 【发布时间】:2016-02-08 18:49:16 【问题描述】:

我正在尝试像这样设置 varchar 变量:

DECLARE @var NVARCHAR(40)
set     @var = (SELECT name from Tmptable AS name )

我想要这样的变量存储值:'name1,name2,name3,...' 这将返回一个类似于标题中的错误:子查询返回超过 1 个值。

我在 on 函数的参数中使用了这个变量

Select *
Into Tmp2
FROM [dbo].[MyFunction](@var, DEFAULT)  AS PARAM
.....

我知道我们不能在一个变量中放入多个值。我需要该变量通过将值拆分为“,”来表示多个值

关于这方面的任何方面

【问题讨论】:

在数据库中存储分隔数据通常是个坏主意。这意味着您必须将其拆分回可用值。您可以使用 FOR XML 来生成分隔列表,但您很快就会回来询问如何拆分列表。有更好的选项,例如表值参数或许多其他选项,而不是分隔列表。 Concatenate many rows into a single text string?的可能重复 有没有办法将 SQL Server 结果集(多行)转换为字符串 @AHiggins 我看看它感兴趣的链接 【参考方案1】:

您可以使用STUFFFOR XML 来做到这一点:

DECLARE @var NVARCHAR(40)
Set     @var = 
(
    SELECT  Distinct Stuff((Select ',' + Name From Tmptable For Xml Path ('')), 1, 1, '') 
    From    Tmptable
)

但是,理想情况下,您不应将逗号分隔值存储在 VARCHAR 中。使用表变量可能会更好:

Declare @Var Table
(
    Name    NVarchar (40)
)

Insert  @Var (Name)
Select  Name
From    TmpTable

【讨论】:

别担心逗号,我有另一个函数可以根据逗号分割这个 VARCHAR。我会测试一下

以上是关于从 Select 语句为变量设置超过 1 个值的主要内容,如果未能解决你的问题,请参考以下文章

在与 CASE 一起使用 THEN 语句后返回超过 1 个值

如何在 Oracle SQL 中将变量设置为 select 语句的结果

在 Oracle 的 select 语句中使用对象类型

MySQL存储过程中使用SELECT …INTO语句为变量赋值

求一SQL语句:如何查询最大的前3个值

SELECT 语句执行时间超过 1 分钟