【问题标题】: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
我们将不胜感激。
【问题讨论】:
标签:
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