2013-03-05 68 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