Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL视图中使用合并_Sql Server_Tsql_Sql Server 2008_Coalesce_Sql View - Fatal编程技术网

Sql server 在SQL视图中使用合并

Sql server 在SQL视图中使用合并,sql-server,tsql,sql-server-2008,coalesce,sql-view,Sql Server,Tsql,Sql Server 2008,Coalesce,Sql View,我需要从几个表中创建一个视图。视图中的一列必须由一个表中的多行组成,作为一个带有逗号分隔值的字符串 下面是我想做的一个简单例子 Customers: CustomerId int CustomerName VARCHAR(100) Orders: CustomerId int OrderName VARCHAR(100) 客户和订单之间存在一对多关系。所以根据这些数据 Customers 1 'John' 2 'Marry' Orders 1 'New Hat' 1 'New Book'

我需要从几个表中创建一个视图。视图中的一列必须由一个表中的多行组成,作为一个带有逗号分隔值的字符串

下面是我想做的一个简单例子

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)
客户和订单之间存在一对多关系。所以根据这些数据

Customers
1 'John'
2 'Marry'

Orders
1 'New Hat'
1 'New Book'
1 'New Phone'
我希望视图是这样的:

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL
所以每个人都会出现在桌子上,不管他们是否有订单

我有一个存储过程,我需要将其转换为该视图,但您似乎无法在视图中声明参数和调用存储过程。关于如何将此查询放入视图有什么建议吗

CREATE PROCEDURE getCustomerOrders(@customerId int)
AS
   DECLARE @CustomerName varchar(100)
   DECLARE @Orders varchar (5000)

   SELECT @Orders=COALESCE(@Orders,'') + COALESCE(OrderName,'') + ',' 
   FROM Orders WHERE CustomerId=@customerId

   -- this has to be done separately in case orders returns NULL, so no customers are excluded
   SELECT @CustomerName=CustomerName FROM Customers WHERE CustomerId=@customerId

   SELECT @CustomerName as CustomerName, @Orders as Orders

编辑:修改答案以包括视图的创建

/* Set up sample data */
create table Customers (
    CustomerId int,
    CustomerName VARCHAR(100)
)

create table Orders (
    CustomerId int,
    OrderName VARCHAR(100)
)

insert into Customers
    (CustomerId, CustomerName)
    select 1, 'John' union all
    select 2, 'Marry'

insert into Orders
    (CustomerId, OrderName)
    select 1, 'New Hat' union all
    select 1, 'New Book' union all
    select 1, 'New Phone'
go

/* Create the view */       
create view OrderView as    
    select c.CustomerName, x.OrderNames
        from Customers c
            cross apply (select stuff((select ',' + OrderName from Orders o where o.CustomerId = c.CustomerId for xml path('')),1,1,'') as OrderNames) x
go

/* Demo the view */
select * from OrderView
go 

/* Clean up after demo */
drop view OrderView
drop table Customers
drop table Orders
go

在SQL Server 2008中,您可以利用为XML添加的一些功能在一个查询中完成这项工作,而无需使用存储过程:

 SELECT CustomerName,
    STUFF( -- "STUFF" deletes the leading ', '
        ( SELECT ', ' + OrderName
        FROM Orders
        WHERE CustomerId = Customers.CutomerId
        -- This causes the sub-select to be returned as a concatenated string
        FOR XML PATH('') 
        ),
    1, 2, '' )
    AS Orders
 FROM Customers

你有什么版本的SQL Server?好极了,它工作起来很神奇!我刚刚在第一个select语句中添加了DISTINCT,并且它已准备就绪。谢谢我的ThisSQL语句的唯一问题是,不能使用索引为CROSS APPLY的语句创建视图,因为索引视图不允许使用CROSS APPLY。关于如何使用此选择将视图转换为索引友好视图,您有什么建议吗?谢谢喜欢它David…一直使用这个XML方法来构建字符串。很好的简短的例子-我能够立即应用它。干杯