如何将我的SQL查询转换为视图?

时间:2014-08-04 14:02:58

标签: sql-server sql-server-2008 tsql

我知道我们不能在视图中使用声明,但我现在别无选择......

有没有办法可以在视图中使用以下内容,如何做到这一点?

    Declare @q varchar(MAX)

;WITH N AS (
  SELECT DISTINCT FD_2A7417DC Pvt_Col 
  FROM   FD_Documents
), C (Cols) As (
  SELECT STUFF((SELECT ',' + QUOTENAME(Pvt_Col) 
                FROM   N
                ORDER BY Pvt_Col
                FOR XML PATH(''), TYPE
               ).value('.', 'NVARCHAR(MAX)') 
              , 1, 1, '')
)
SELECT @q 
       = 'SELECT ID_Number, Company, Date_Of_Birth, Department, Name
               , Surname, Passport_No, Job_Title, Start_Date
               , End_Date, Type
               , ' + Cols + ' 
          FROM  (SELECT FD_0D39C6B0 AS Company, FD_DDD24E25 AS Date_Of_Birth, FD_74290EA9 AS Department, FD_2A7417DC AS Document_Type, FD_E3421C61 AS Name
                      , FD_2B9CFA8C AS Surname, FD_96990BE2 AS ID_Number, FD_E6621D8A as Passport_No, FD_3744C28A AS Job_Title, FD_903EBB60 as Start_Date
                      , FD_9BBAD0CA AS End_Date, FD_AE108F93 as Type
                 FROM FD_Documents
                ) x
                PIVOT 
                (COUNT(Document_Type) FOR Document_Type in (' + Cols + ')) pvt'
FROM C

execute(@q)

2014年8月15日更新

这是我现在的。

create function dbo.tvf_getDocumentType()
returns @t table(ColName int FD_0D39C6B0 AS Company, FD_DDD24E25 AS Date_Of_Birth, FD_74290EA9 AS Department, FD_2A7417DC AS Document_Type, FD_E3421C61 AS Name
                      , FD_2B9CFA8C AS Surname, FD_96990BE2 AS ID_Number, FD_E6621D8A as Passport_No, FD_3744C28A AS Job_Title, FD_903EBB60 as Start_Date
                      , FD_9BBAD0CA AS End_Date, FD_AE108F93 as Type)
as
begin
   Declare @q varchar(MAX)

;WITH N AS (
  SELECT DISTINCT FD_2A7417DC Pvt_Col 
  FROM   FD_Documents
), C (Cols) As (
  SELECT STUFF((SELECT ',' + QUOTENAME(Pvt_Col) 
                FROM   N
                ORDER BY Pvt_Col
                FOR XML PATH(''), TYPE
               ).value('.', 'NVARCHAR(MAX)') 
              , 1, 1, '')
)
SELECT @q 
       = 'SELECT ID_Number, Company, Date_Of_Birth, Department, Name
               , Surname, Passport_No, Job_Title, Start_Date
               , End_Date, Type
               , ' + Cols + ' 
          FROM  (SELECT FD_0D39C6B0 AS Company, FD_DDD24E25 AS Date_Of_Birth, FD_74290EA9 AS Department, FD_2A7417DC AS Document_Type, FD_E3421C61 AS Name
                      , FD_2B9CFA8C AS Surname, FD_96990BE2 AS ID_Number, FD_E6621D8A as Passport_No, FD_3744C28A AS Job_Title, FD_903EBB60 as Start_Date
                      , FD_9BBAD0CA AS End_Date, FD_AE108F93 as Type
                 FROM FD_Documents
                ) x
                PIVOT 
                (COUNT(Document_Type) FOR Document_Type in (' + Cols + ')) pvt'
FROM C

execute(@q)

end

错误消息。消息102,级别15,状态1,过程tvf_getDocumentType,第2行 'FD_0D39C6B0'附近的语法不正确。

我现在正在使用此代码进入未知的水域。

1 个答案:

答案 0 :(得分:2)

首先,我会开始查看此链接here。但是,您的存储过程应如下所示:

/****** Object:  StoredProcedure [dbo].[getDocumentType]    Script Date: 8/4/2014 1:11:22 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[getDocumentType]

AS
BEGIN
    Declare @q varchar(MAX)

    ;WITH N AS (
      SELECT DISTINCT FD_2A7417DC Pvt_Col 
      FROM   FD_Documents
    ), C (Cols) As (
      SELECT STUFF((SELECT ',' + QUOTENAME(Pvt_Col) 
                    FROM   N
                    ORDER BY Pvt_Col
                    FOR XML PATH(''), TYPE
                   ).value('.', 'NVARCHAR(MAX)') 
                  , 1, 1, '')
    )
    SELECT @q 
           = 'SELECT ID_Number, Company, Date_Of_Birth, Department, Name
                   , Surname, Passport_No, Job_Title, Start_Date
                   , End_Date, Type
                   , ' + Cols + ' 
              FROM  (SELECT FD_0D39C6B0 AS Company, FD_DDD24E25 AS Date_Of_Birth, FD_74290EA9 AS Department, FD_2A7417DC AS Document_Type, FD_E3421C61 AS Name
                          , FD_2B9CFA8C AS Surname, FD_96990BE2 AS ID_Number, FD_E6621D8A as Passport_No, FD_3744C28A AS Job_Title, FD_903EBB60 as Start_Date
                          , FD_9BBAD0CA AS End_Date, FD_AE108F93 as Type
                     FROM FD_Documents
                    ) x
                    PIVOT 
                    (COUNT(Document_Type) FOR Document_Type in (' + Cols + ')) pvt'
    FROM C

    execute(@q)
END
GO

然后,您应该能够运行exec getDocumentType来检索数据(或者通过前端代码,但是您将要检索它)。

2014年12月12日更新

根据我们在评论中的对话,您还可以沿着表值函数的路径走下去,这应该与存储过程看起来不同。我建议如下:

CREATE FUNCTION dbo.tvf_getDocumentType()
RETURNS TABLE
    AS
RETURN
    (
        /*
        Put all code between the BEGIN and END here
        */
    )
GO

您应该可以执行以下操作:

select * dbo.tvf_getDocumentType()

此select语句应该能够进入视图。

2014年8月14日更新

显然有两种方法可以使用表值函数,上面提到的选项是一种方法。第二个选项列在here。我不确定如何完全调整你的查询以配合它,但你必须以这种方式设置:

create function dbo.tvf_getDocumentType()
returns @T table(ColName int /*list necessary columns here*/)
as
begin
  /*insert code here*/
end

您可能需要修改动态查询,以便在执行过程中将项选择到表变量中。我想我可能需要对这个选项做更多的研究。

2014年8月19日更新

根据下面的注释,当你这样做时会发生什么?参考设置列出了here

create function dbo.tvf_getDocumentType()
returns @TableResults TABLE (
    /*Please adjust your data types according to your column structures.
      Data types listed here are strictly for explanation and is just a 
      guess on what you have.*/
    ID_Number int NOT NULL,
    Company varchar(32) NOT NULL,
    Date_Of_Birth datetime NOT NULL, 
    Department varchar(32) NOT NULL, 
    Name varchar(32) NOT NULL, 
    Surname varchar(32) NOT NULL, 
    Passport_No varchar(16) NOT NULL, 
    Job_Title varchar(32) NOT NULL, 
    Start_Date datetime NOT NULL,
    End_Date datetime NOT NULL, 
    Type varchar(32) NOT NULL,
    Cols varchar(32) NOT NULL
    )
as
begin
    Declare @q varchar(MAX)

    ;WITH N AS (
      SELECT DISTINCT FD_2A7417DC Pvt_Col 
      FROM   FD_Documents
    ), C (Cols) As (
      SELECT STUFF((SELECT ',' + QUOTENAME(Pvt_Col) 
                    FROM   N
                    ORDER BY Pvt_Col
                    FOR XML PATH(''), TYPE
                   ).value('.', 'NVARCHAR(MAX)') 
                  , 1, 1, '')
    )
    SELECT @q 
           = 'INSERT INTO  @TableResults
            (ID_Number, Company, Date_Of_Birth, Department, Name
                   , Surname, Passport_No, Job_Title, Start_Date
                   , End_Date, Type, Cols) 
            SELECT ID_Number, Company, Date_Of_Birth, Department, Name
                   , Surname, Passport_No, Job_Title, Start_Date
                   , End_Date, Type
                   , ' + Cols + ' 
              FROM  (SELECT FD_0D39C6B0 AS Company, FD_DDD24E25 AS Date_Of_Birth, FD_74290EA9 AS Department, FD_2A7417DC AS Document_Type, FD_E3421C61 AS Name
                          , FD_2B9CFA8C AS Surname, FD_96990BE2 AS ID_Number, FD_E6621D8A as Passport_No, FD_3744C28A AS Job_Title, FD_903EBB60 as Start_Date
                          , FD_9BBAD0CA AS End_Date, FD_AE108F93 as Type
                     FROM FD_Documents
                    ) x
                    PIVOT 
                    (COUNT(Document_Type) FOR Document_Type in (' + Cols + ')) pvt'
    FROM C

    execute(@q)

return
end

这应该可行,但我无法测试您的查询。完成后,运行以下行:

select * from dbo.tvf_getDocumentType()

如果它可以工作,你应该能够把它扔进一个视图。如果它不起作用,我就会茫然不知所措。