У меня проблема с получением результата этого SQL запроса. Это дает результат другими инструментами, но я не могу объявить его в C#. У меня не было проблем с простыми запросами без DECLARE
, SET
et c ...
Запрос в SQL:
DECLARE @SelectCols nvarchar(MAX),
@Cols nvarchar(MAX),
@Query nvarchar(MAX),
@MinDate date = '2020-03-01',
@MaxDate date = '2020-03-07'
SET @SelectCols = STUFF((SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
',ISNULL(' + QUOTENAME (CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20)))+',0) AS '+QUOTENAME (CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20)))
FROM sys.all_objects a CROSS JOIN sys.all_objects b
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @Cols = STUFF((SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
',' + QUOTENAME (CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20)))
FROM sys.all_objects a CROSS JOIN sys.all_objects b
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @Query ='DECLARE @MinDate1 DATE = ''' + CAST(@MinDate AS varchar(20)) +'''
DECLARE @MaxDate1 DATE = ''' +CAST(@MaxDate AS varchar(20)) + '''
SELECT FIRMA,' + @SelectCols + ' FROM
(
SELECT Shortcut as FIRMA, cast(mg.data as date) as DATA, CAST(ABS(SUM(mg.wartoscWz)) as decimal(20,2)) as WART
FROM HM.MG
INNER JOIN SSCommon.STContractors STC ON MG.khid = STC.id
WHERE MG.subtyp = 89
AND MG.aktywny = 1
AND MG.anulowany = 0
AND MG.bufor = 0
AND MG.kod like ''%PZ''
AND MG.typ_dk <> ''SrT''
AND MG.createdDate >= @MinDate1 and MG.createdDate < DATEADD(day, 1, @MaxDate1)
Group by (Shortcut), mg.data
) DANE
PIVOT
(
max(WART) FOR [DATA] IN ( ' +@cols+ ')
) p
ORDER BY FIRMA
'
Execute(@query)
Этот запрос работает, но мое объявление в C# не работает, и я не могу найти ошибку, или я сделал что-то не так.
String sql = @"DECLARE @SelectCols nvarchar(MAX), @Cols nvarchar(MAX), @Query nvarchar(MAX), "
+ "@MinDate date = '" +parametra + "', "
+ "@MaxDate date = '" + parametrb + "' "
+ "SET @SelectCols = STUFF((SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) "
+ "',ISNULL(' + QUOTENAME (CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20)))+',0) AS '+QUOTENAME (CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20))) "
+ "FROM sys.all_objects a CROSS JOIN sys.all_objects b "
+ "FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') "
+ "SET @Cols = STUFF((SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) "
+ "',' + QUOTENAME(CAST(DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)AS varchar(20))) "
+ "FROM sys.all_objects a CROSS JOIN sys.all_objects b "
+ "FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') "
+ "SET @Query ='DECLARE @MinDate1 DATE = ''' + CAST(@MinDate AS varchar(20)) +'''"
+ "DECLARE @MaxDate1 DATE = ''' +CAST(@MaxDate AS varchar(20)) + ''' "
+ "SELECT FIRMA,' + @SelectCols + ' FROM "
+ "( "
+ "SELECT Shortcut as FIRMA, cast(mg.data as date) as DATA, CAST(ABS(SUM(mg.wartoscWz)) as decimal(20, 2)) as WART "
+ "FROM HM.MG "
+ "INNER JOIN SSCommon.STContractors STC ON MG.khid = STC.id "
+ "WHERE MG.subtyp = 89 "
+ "AND MG.aktywny = 1 "
+ "AND MG.anulowany = 0 "
+ "AND MG.bufor = 0 "
+ "AND MG.kod like ''%PZ'' "
+ "AND MG.typ_dk <> ''SrT'' "
+ "AND MG.createdDate >= @MinDate1 and MG.createdDate < DATEADD(day, 1, @MaxDate1) "
+ "Group by (Shortcut), mg.data "
+ ") DANE "
+ "PIVOT "
+ "( "
+ "max(WART) FOR [DATA] IN ( ' +@cols+ ') "
+ ") p "
+ "ORDER BY FIRMA "
+ "Execute(@query)";