【问题标题】:SQL Server sp_execute - Error with DateTime Variable in the Dynamic SQLSQL Server sp_execute - 动态 SQL 中的 DateTime 变量出错
【发布时间】:2013-02-20 12:31:19
【问题描述】:

我尝试使用 sp_executesql 创建动态 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

我们将不胜感激。

【问题讨论】:

  • 你读过documentation for sp_executesql,尤其是例子吗?

标签: sql-server sql-server-2008 tsql dynamic-sql sp-executesql


【解决方案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
    

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2018-06-13
    • 1970-01-01
    • 2017-01-20
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2014-06-02
    相关资源
    最近更新 更多