2014-09-15 3 views
0

У меня есть таблица под названием report с 3-мя столбцами:Проблема с входными параметрами и типами данных в SQL Server

reportdate date, name varchar(10), location varchar(10) 

Sample данные:

reportdate name location 
------------------------------- 
2014-01-01 sachin vizag 
2014-02-02 tendulkar vizag 
2014-03-03 ram vizag 
2014-04-04 robert vizag 
2014-05-05 rahim vizag 
2014-06-06 king vizag 
2013-01-01 sachin vizag 
2013-02-02 tendulkar vizag 
2013-03-03 ram vizag 
2013-04-04 robert vizag 
2013-05-05 rahim vizag 
2013-06-06 king vizag  

Sample SQL Fiddle

Мой фактическое требование было создайте параметр даты для отчетов SSRS. Поэтому для этой цели я взял столбец reportdate.

Мне нужно создать 3 параметр из одного reportdate колонок

Параметр 1:

мне нужно выбрать только значение года из reportdate колонки, для которой я использовал этот запрос

select distinct YEAR(ReportDate) as ReportYear 
from report 

и результатом этого было

ReportYear 
---------- 
2013 
2014 

Параметр 2:

Мне нужно создать параметр в течение нескольких месяцев колонку и это хранимая процедура, которую я создал

create procedure months 
    @years date 
as begin 
    select distinct 
     Case 
     When CONVERT(varchar(2), ReportDate, 101) = 01 Then 'JAN' 
     When CONVERT(varchar(2), ReportDate, 101) = 02 Then 'FEB' 
     When CONVERT(varchar(2), ReportDate, 101) = 03 Then 'MAR' 
     When CONVERT(varchar(2), ReportDate, 101) = 04 Then 'APR' 
     When CONVERT(varchar(2), ReportDate, 101) = 05 Then 'MAY' 
     When CONVERT(varchar(2), ReportDate, 101) = 06 Then 'JUN' 
     When CONVERT(varchar(2), ReportDate, 101) = 07 Then 'JUL' 
     When CONVERT(varchar(2), ReportDate, 101) = 08 Then 'AUG' 
     When CONVERT(varchar(2), ReportDate, 101) = 09 Then 'SEP' 
     When CONVERT(varchar(2), ReportDate, 101) = 10 Then 'OCT' 
     When CONVERT(varchar(2), ReportDate, 101) = 11 Then 'NOV' 
     When CONVERT(varchar(2), ReportDate, 101) = 12 Then 'DEC' 
     end ReportMonth 
     --,year(reportdate) As ReportYear 
    from 
     report 
    where 
     reportdate in (select CAST(cast(@years as datetime)as date)) 
     --order by DATEPART(m,ReportMonth) 

end 

Я передаю лет в качестве параметра в описанной выше процедуре, если Я передаю значение 2013/2014 в качестве параметра, то мой выход должен быть, как показано ниже

ReportMonth ReportYear 
----------------------- 
JAN 2014 
FEB 2014 
MAR 2014 
APR 2014 
MAY 2014 
JUN 2014 
JAN 2013 
FEB 2013 
MAR 2013 
APR 2013 
MAY 2013 
JUN 2013 

вместо выше выход я получаю быть низкий выход, если я запускаю выше хранимую процедуру на год 2013.

ReportMonth ReportYear 
------------------------ 
JAN 2013 

Я не понимаю, почему только один месяц заселяется вместо всех доступных месяцев в таблице.

+0

Каков набор возможных параметров, которые вы хотите передать процессу? Это '2013',' 2013/2014', '2013/2014/2015' или это всегда два года в формате' 2013/2014'? – jpw

+0

@jpw: это зависит от данных в моей таблице, если у меня есть данные за один год, то только 1 год, если у меня есть n количество лет в течение всех лет. – 0537

ответ

1

Если вы хотите передать параметры, например, 2013/2014, вам, вероятно, необходимо использовать функцию для разделения параметров (имеется множество примеров разделенных функций по сети), но если вы не хотите обрабатывать параметры разделения один из способов достижения этой цели является использование динамического SQL в процедуре:

CREATE PROC Months @YEARS VARCHAR(50) 
AS 
BEGIN 
DECLARE @SQL VARCHAR(500) = 
'SELECT DISTINCT 
    MONTH(ReportDate) AS [Month], 
    UPPER(LEFT(DATENAME(MONTH,ReportDate),3)) AS ReportMonth, 
    YEAR(ReportDate) AS ReportYear 
FROM Report 
WHERE YEAR(ReportDate) IN (' + @YEARS + ') 
ORDER BY ReportYear DESC, [Month]' 
EXEC (@SQL) 
END; 

я включил номер месяца для сортировки (и это могло бы быть хорошо иметь слишком).

Когда называют EXEC Months '2013, 2014' это выведет:

Month  ReportMonth ReportYear 
----------- ----------- ----------- 
1   JAN   2014 
2   FEB   2014 
3   MAR   2014 
4   APR   2014 
5   MAY   2014 
6   JUN   2014 
1   JAN   2013 
2   FEB   2013 
3   MAR   2013 
4   APR   2013 
5   MAY   2013 
6   JUN   2013 

Другим вариантом было бы создать таблицу значных типа, объявить переменную на основе этого типа, вставить лет вы хотите фильтровать и иметь процедуру принять таблицу оцененного типа в качестве параметра:

CREATE TYPE YearsType AS TABLE (Y INT) 
GO 
CREATE PROC M @YEARS YearsType READONLY 
AS 
SELECT DISTINCT 
    MONTH(ReportDate) AS [Month], 
    UPPER(LEFT(DATENAME(MONTH,ReportDate),3)) AS ReportMonth, 
    YEAR(ReportDate) AS ReportYear 
FROM Report 
WHERE YEAR(ReportDate) IN (SELECT Y FROM @YEARS) 
ORDER BY ReportYear DESC, [Month] 
GO 

DECLARE @Years YearsType 
--INSERT @Years VALUES (2013) 
INSERT @Years VALUES (2013),(2014) 
EXECUTE M @YEARS 

это, очевидно, имеют некоторые недостатки в том, что вам нужно объявить локальные переменные таблицы и заполнить ее перед вызовом процедуры.

Sample SQL Fiddle для обеих версий выше.

+0

например, если у меня есть 4 года в моей таблице, 2011,2012,2013,2014, и мне нужно отфильтровать данные на основе любых двух значений даты. Пункт здесь, как будто мне нужно передать год в качестве параметра. – 0537

+0

@satishkumar О, хорошо. Я не понял, что вам нужно фильтровать; Я прочитал ваш комментарий, как вы хотели все эти годы. Я верну свой ответ и обнов его позже. Вы всегда хотите фильтровать два года? – jpw

+0

не всегда на 2 года, но более 1 года. это может быть 2 или 3 или 4, в зависимости от выбора пользователя @jpw – 0537

1

Я бы сказал, что ваше предложение where не выглядит правильным. Вы должны проверить DATEPART (YEAR, reportdate) равным году, который вы передали в качестве параметра в хранимую процедуру.

Ваше предложение WHERE проверяет, является ли reportdate в наборе с одной датой, которая равна 1 января того же года. Это явно не то, что вы хотите.

Смежные вопросы