2013-03-05 27 views
1

日期時間變量我試圖創建使用sp_executesql動態SQL,但它給了我這個錯誤消息:SQL服務器sp_execute - 錯誤與動態SQL

消息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 

任何輸入將不勝感激。

+2

你讀過[文件]爲'sp_executesql'(http://msdn.microsoft.com/en-us/library/ms188001(V =的.aspx SQL.100)),尤其是例子? – Pondlife 2013-03-05 22:10:55

回答

1

下面的T-SQL應該照顧你的問題。雖然,我不建議用「sp_」作爲前綴存儲過程名稱,因爲系統存儲過程使用此命名約定。您不希望將存儲過程與系統存儲過程混淆,或者更糟糕的是,Microsoft決定將其未來的系統存儲過程命名爲您的名稱。

注意事項:

  • 您可以定義/聲明要傳遞到在@ParameterDefinition變量的動態SQL語句中的所有自定義參數。
  • 將每個自定義變量添加到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