SQL Server sp_execute - Грешка с променлива DateTime в динамичния SQL

Опитах се да създам динамичен SQL с помощта на sp_executesql, но ми дава следното съобщение за грешка:

Съобщение 137, ниво 15, състояние 2, ред 20
Трябва да декларира скаларната променлива "@start".

Ето моя скрипт за съхранена процедура

CREATE PROCEDURE sp_test (@start datetime, @end datetime)
AS
BEGIN
   DECLARE @sql nvarchar(MAX)

   SET @sql = 'SELECT * FROM table1 WHERE '
   SET @sql = @sql + N'startDate BETWEEN @start AND @end'

   EXEC sp_executesql @sql

Всеки принос ще бъде оценен.


person Lakhae    schedule 05.03.2013    source източник
comment
Прочетохте ли документацията за sp_executesql , особено примерите?   -  person Pondlife    schedule 06.03.2013


Отговори (1)


T-SQL по-долу трябва да се погрижи за вашия проблем. Въпреки това, не бих препоръчал да поставяте префикс името на вашата запаметена процедура с "sp_", тъй като системните запомнени процедури използват тази конвенция за именуване. Не бихте искали вашите съхранени процедури да бъдат объркани със системни съхранени процедури или по-лошо, Microsoft решава да назове една от бъдещите си системни съхранени процедури с името на вашето.

Неща за отбелязване:

  • Вие дефинирате/декларирате всички персонализирани параметри, които искате да предадете във вашия динамичен SQL израз в променливата @ParameterDefinition.
  • Добавяте всяка от вашите потребителски променливи към извикването на sp_executesql, сякаш вече са част от процедурата.

    IF OBJECT_ID('sp_test', 'P') IS NOT NULL DROP PROCEDURE sp_test
    GO
    -- ============================================================================
    -- CALLING EXAMPLE:
    -- EXEC sp_test '01/01/1901', '01/02/1901'
    -- ============================================================================
    CREATE PROCEDURE sp_test (@start datetime, @end datetime)
    AS
    BEGIN
    
    DECLARE @sql nvarchar(max)
    
    SET @sql = 'SELECT * FROM table1 WHERE '
    SET @sql = @sql + N'startDate BETWEEN @start AND @end'
    
    -- Build the Parameter Definition list for the dynamic SQL statement below  
    DECLARE @ParameterDefinition nvarchar(1000);
    SELECT @ParameterDefinition = ''  
    + ' @start datetime'  
    + ',@end datetime' 
    
    EXEC sp_executesql  
        @statement  = @sql  
       ,@params     = @ParameterDefinition  
       -- Assign values to any of custom parameters defined in @ParameterDefinition:  
       ,@start      = @start  
       ,@end        = @end  
    
    END
    GO
    
person Rob.Kachmar    schedule 14.03.2013