我知道我们不能在视图中使用声明,但我现在别无选择......
有没有办法可以在视图中使用以下内容,如何做到这一点?
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'附近的语法不正确。
我现在正在使用此代码进入未知的水域。
答案 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()
如果它可以工作,你应该能够把它扔进一个视图。如果它不起作用,我就会茫然不知所措。