2016-07-01 5 views
3

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

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

Я знаю, что я пропустил что-то важное, но после того, как я вошел в код с кодом, я дошел до необходимой помощи экспертов.

Это мой код (сокращенный):

Alter Procedure [Test] 
    @StartDate AS varchar(6), 
    @EndDate AS varchar(6) 
AS 
    Set @StartDate = '201620' --Define start YearWeek 
    Set @EndDate = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2))) 

    SELECT 
     * 
    FROM 
     (SELECT DISTINCT 
      [YEAR], [WeekOfYear] 
     FROM 
      [dbo].[DimDate] 
     WHERE 
      [Year] + [WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN 
     [Schema].[Table1] qad ON (qad.[Year] + qad.[Week of the Year]) = (dimd.[Year] + dimd.WeekOfYear) 

Когда я запускаю процедуру я получаю:

Msg 201, Level 16, State 4 Процедура испытания, линия 0
Процедура или функция 'test' ожидает параметр '@StartDate', который не был указан .

Заранее спасибо.

+0

Почему вы запрашиваете '@ StartDate' и' @ EndDate' в качестве параметра, если вы устанавливаете их в своем tsql? просто объявите их в t-sql и он должен работать нормально – jellz77

+3

Если эти параметры называются 'StartDate' и' EndDate' - ***, то почему на EARTH *** они имеют тип 'varchar (6)' ?? Вы всегда должны использовать наиболее подходящий тип данных, а строка определенно не является лучшим выбором для ** даты ** - используйте 'DATE' или' DATETIME2 (n) 'для любых связанных с датой! –

+0

Ваше название относится к значениям по умолчанию, но вы на самом деле ничего не указываете. Вы могли бы добавить '= null' в объявления, чтобы фактически предоставить им значения по умолчанию, а затем вы могли бы' exec', не передавая их. Существующие ответы уже указывают на некоторые другие исправления. – shawnt00

ответ

5

Я написал с параметрами, которые предопределены

Они не «предопределены» логически, где-то внутри вашего кода. Но в качестве аргументов SP они не имеют значений по умолчанию и требуются. Для того, чтобы избежать передачи этих Params явно необходимо определить значения по умолчанию в определении SP:

Alter Procedure [Test] 
    @StartDate AS varchar(6) = NULL, 
    @EndDate AS varchar(6) = NULL 
AS 
... 

значения NULL или пустая строка или что-то более разумно - до вас. Это не имеет значения, поскольку вы переписываете значения этих аргументов в первых строках SP.

Теперь вы можете назвать это, не передавая никаких аргументов, например. exec dbo.TEST

+0

Спасибо @ Иван-Старостин. Теперь я понимаю, что я сделал. Как бы немного глупо. Я буду передавать параметры к нему позже, когда я создам интерфейс Excel, поэтому я не отказал им Null. Теперь его работа :) –

0

Я бы сделал это одним из двух способов. Так как вы устанавливаете начальные и конечные даты в коде T-SQL, я бы не попросить параметры в хранимой процедуре

Вариант 1

Create Procedure [Test] AS 
    DECLARE @StartDate varchar(10) 
    DECLARE @EndDate varchar(10) 
    Set @StartDate = '201620' --Define start YearWeek 
    Set @EndDate = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2))) 

SELECT 
* 
FROM 
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear) 

Вариант 2

Create Procedure [Test] @StartDate varchar(10),@EndDate varchar(10) AS 

SELECT 
* 
FROM 
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear) 

Затем запустите exec test '2016-01-01','2016-01-25'

+0

также, скорее всего, вы захотите установить свой «varchar» на соответствующее количество символов ... я использовал 10, но вам может понадобиться 6 на ваш оригинальный пост – jellz77

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