TSQL中的参数与变量

在TSQL中,查询语句编译时并不为变量赋值(SET OR SELECT Operation),即变量赋值在编译完成,语句执行时才执行赋值操作,因此查询优化器不一定能为查询语句生成一个合适的执行计划

ex:

DECLARE @Id INT =100;
SELECT * FROM dbo.Users
WHERE UserId>@Id

可以使用以下几种方式修改:

--=====================================================
DECLARE @Id INT =100;
SELECT * FROM dbo.Users
WHERE UserId>@Id
OPTION(RECOMPILE)
--=====================================================
DECLARE @Id INT =100;
SELECT * FROM dbo.Users
WHERE UserId>@Id
OPTION(RECOMPILE(@ID=2));
--=====================================================
SP_EXECUTESQL '
SELECT * FROM dbo.Users
WHERE UserId>@Id',N'@Id INT',@ID=100
--=====================================================
CREATE PROCEDURE dbo.usp_GetUser
(
    @ID INT
)
AS
BEGIN
    SELECT * FROM dbo.Users
WHERE UserId>@Id
END
GO
EXEC dbo.usp_GetUser @ID=100
--=====================================================

 存储过程在首次执行时进行编译并缓存以便后续重复调用

ps:此文章参照'大材小用'博客http://www.cnblogs.com/slade/archive/2012/04/29/2476463.html#2367297

原文地址:https://www.cnblogs.com/TeyGao/p/2478218.html