我尝试使用sp_executesql
创建动态SQL,但它给出了以下错误消息:
Msg 137,Level 15,State 2,Line 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
任何意见都将受到赞赏。
答案 0 :(得分:1)
以下T-SQL应该解决您的问题。虽然,我不建议使用“sp_”为存储过程名称添加前缀,因为系统存储过程使用此命名约定。您不希望将存储过程与系统存储过程混淆,或者更糟糕的是,Microsoft决定使用您的名称命名其中一个未来的系统存储过程。
注意事项:
将每个自定义变量添加到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