1
我读过的地方,不可能从动态查询创建存储过程。必须声明标量变量“@query”动态tsql存储过程
我有一些错误,我没有声明标量变量。
这里是我的TSQL动态报告这是工作:
DECLARE
@cols AS NVARCHAR(MAX),
@selcols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime,
@enddate datetime,
@paramdef nvarchar(max)
SET @startdate = '2013-02-01'
SET @enddate = '2013-05-10';
SET @paramdef = '@startdate datetime, @enddate datetime';
SELECT
@selcols = STUFF((SELECT ','+'ISNULL(' + QUOTENAME(convert(varchar(10), [Date], 120)) + ', 0) AS ' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = N'SELECT CreatedBy,Name, Surname,EventTypeID,Event, '+ @selcols + ',Total
from
(
select av.EventTypeID,av.CreatedBy,emp.Name,emp.Surname,Event,
convert(varchar(10), [Date], 120) [Date],
row_number() over(PARTITION BY [date],av.EventTypeID,av.CreatedBy order BY av.EventTypeID,av.CreatedBy) m,
count(*) over(partition by av.CreatedBy,av.EventTypeId) Total
from AdeccoView av
left join EventType et on et.EventTypeID = av.EventTypeID
left join Employee emp on av.CreatedBy = emp.EmployeeD
) x
pivot
(
max(m)
for [Date] in ('[email protected]+')
) p '
exec sp_executesql @query, @paramdef, @startdate = @startdate, @enddate [email protected];
而现在,
我希望它通过存储过程或视图(也许是更容易后来在实体框架6实现, asp.net)。所以,我的存储过程是这样的:
CREATE PROCEDURE GetEmployees
(@startDateInput datetime = NULL, @endDateInput datetime = NULL)
AS
SET NOCOUNT ON;
DECLARE
@cols AS NVARCHAR(MAX),
@selcols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime,
@enddate datetime,
@paramdef nvarchar(max)
SET @startdate = @startDateInput
SET @enddate = @endDateInput
SET @paramdef = '@startdate datetime, @enddate datetime';
SELECT
@selcols = STUFF((SELECT ','+'ISNULL(' + QUOTENAME(convert(varchar(10), [Date], 120)) + ', 0) AS ' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = N'SELECT CreatedBy,Name, Surname,EventTypeID,Event, '+ @selcols + ',Total
from
(
select av.EventTypeID,av.CreatedBy,emp.Name,emp.Surname,Event,
convert(varchar(10), [Date], 120) [Date],
row_number() over(PARTITION BY [date],av.EventTypeID,av.CreatedBy order BY av.EventTypeID,av.CreatedBy) m,
count(*) over(partition by av.CreatedBy,av.EventTypeId) Total
from AdeccoView av
left join EventType et on et.EventTypeID = av.EventTypeID
left join Employee emp on av.CreatedBy = emp.EmployeeD
) x
pivot
(
max(m)
for [Date] in ('[email protected]+')
) p '
GO
exec sp_executesql @query, @paramdef, @startdate = @startDateInput, @enddate [email protected];
编辑:
这是我更新的代码BEGIN和END,删除GO语句
CREATE PROCEDURE GetEmployees
(@startDateInput datetime = NULL, @endDateInput datetime = NULL)
AS
SET NOCOUNT ON;
BEGIN
DECLARE
@cols AS NVARCHAR(MAX),
@selcols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime,
@enddate datetime,
@paramdef nvarchar(max)
SET @startdate = @startDateInput
SET @enddate = @endDateInput
SET @paramdef = '@startdate datetime, @enddate datetime';
SELECT
@selcols = STUFF((SELECT ','+'ISNULL(' + QUOTENAME(convert(varchar(10), [Date], 120)) + ', 0) AS ' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120))
FROM AdeccoView
--where datein > @startdate
-- and datein <= @enddate
GROUP BY [Date]
ORDER BY [Date]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = N'SELECT CreatedBy,Name, Surname,EventTypeID,Event, '+ @selcols + ',Total
from
(
select av.EventTypeID,av.CreatedBy,emp.Name,emp.Surname,Event,
convert(varchar(10), [Date], 120) [Date],
row_number() over(PARTITION BY [date],av.EventTypeID,av.CreatedBy order BY av.EventTypeID,av.CreatedBy) m,
count(*) over(partition by av.CreatedBy,av.EventTypeId) Total
from AdeccoView av
left join EventType et on et.EventTypeID = av.EventTypeID
left join Employee emp on av.CreatedBy = emp.EmployeeD
) x
pivot
(
max(m)
for [Date] in ('[email protected]+')
) p '
END
exec sp_executesql @query, @paramdef, @startdate = @startDateInput, @enddate [email protected];
请参阅我的编辑代码。你觉得现在好吗?存储过程已成功完成。我认为你的答案是解决方案。谢谢! – Stefan0309
@ Stefan0309。 。 。你的代码看起来很合理(虽然我认为主体应该缩进)。 –