1

我在上一个问题中已经回答了这种问题,但现在我有另一个问题。我正在尝试创建一个视图,并且已经帮助创建了以下查询;

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )

INSERT  INTO @table
        SELECT  dbo.AMGR_User_Fields_Tbl.Type_Id, dbo.AMGR_User_Fields_Tbl.Client_Id, dbo.AMGR_User_Field_Defs_Tbl.Description AS PBX_Vendor
            FROM    dbo.AMGR_User_Fields_Tbl INNER JOIN
                    dbo.AMGR_User_Field_Defs_Tbl ON dbo.AMGR_User_Fields_Tbl.Type_Id = dbo.AMGR_User_Field_Defs_Tbl.Type_Id AND 
                    dbo.AMGR_User_Fields_Tbl.Code_Id = dbo.AMGR_User_Field_Defs_Tbl.Code_Id
            WHERE     (dbo.AMGR_User_Fields_Tbl.Type_Id = 127)

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ', ' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]

这给了我需要的结果,并将列的结果放在同一个单元格中。但是,当我保存视图时,我得到“关键字 DECLARE 附近的语法不正确”。我知道我无法在视图中运行 Declare,那么我可以运行什么替代方案?它必须是一个视图。

4

2 回答 2

0

您不能在视图中声明变量。

您不能在视图定义中声明变量。您可以在过程中创建逻辑或修改视图以使用内置的 user_name() 函数来返回过滤结果。

参考这里

于 2012-05-16T09:39:57.640 回答
0

我可能在这里遗漏了一些东西,但你为什么不这样做呢?

WITH ctetable 
     AS (SELECT dbo.AMGR_User_Fields_Tbl.Type_Id, 
                dbo.AMGR_User_Fields_Tbl.Client_Id, 
                dbo.AMGR_User_Field_Defs_Tbl.Description AS PBX_Vendor 
         FROM   dbo.AMGR_User_Fields_Tbl 
                INNER JOIN dbo.AMGR_User_Field_Defs_Tbl 
                  ON dbo.AMGR_User_Fields_Tbl.Type_Id = 
                     dbo.AMGR_User_Field_Defs_Tbl.Type_Id 
                     AND dbo.AMGR_User_Fields_Tbl.Code_Id = 
                         dbo.AMGR_User_Field_Defs_Tbl.Code_Id 
         WHERE  ( dbo.AMGR_User_Fields_Tbl.Type_Id = 127 )) 
SELECT [Type_ID], 
       [Client_ID], 
       (SELECT Stuff((SELECT ', ' + [PBX_Vendor] 
                      FROM   ctetable 
                      WHERE  [Client_ID] = tbl.[Client_ID] 
                             AND [Type_ID] = tbl.[Type_ID] 
                      GROUP  BY [PBX_Vendor] 
                      ORDER  BY [PBX_Vendor] 
                      FOR xml path('')), 1, 1, '')) PBX_Vendor 
FROM   ctetable tbl 
GROUP  BY [Type_ID], 
          [Client_ID] 

您可以在此处了解有关 CTE的更多信息。

使用公用表表达式

可以将公用表表达式 (CTE) 视为在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 类似于派生表,因为它不存储为对象,并且仅在查询期间持续存在。与派生表不同,CTE 可以是自引用的,并且可以在同一查询中多次引用。

于 2012-05-16T09:43:53.220 回答