Mar*_*arc 7 sql t-sql sql-server sql-server-2005
我希望我可以在我的where子句中执行SQl Server 2005(我知道它无效)中的以下内容.有时@teamID(传入存储过程)将是现有teamID的值,否则它将始终为零,我想要Team表中的所有行.
我使用Case进行了研究,运算符需要在整个语句之前或之后出现,这使得我无法根据@teamid的值使用不同的运算符.除了复制我的select语句之外的任何建议.
declare @teamid int
set @teamid = 0
Select Team.teamID From Team
case @teamid
when 0 then
WHERE Team.teamID > 0
else
WHERE Team.teamID = @teamid
end
Run Code Online (Sandbox Code Playgroud)
And*_*mar 18
没有案例你可以这样做:
SELECT Team.teamID
FROM Team
WHERE (@teamid = 0 AND Team.teamID > 0)
OR (@teamid <> 0 AND Team.teamID = @teamid)
Run Code Online (Sandbox Code Playgroud)
不使用动态SQL,性能最佳的选项是:
IF @teamid = 0
BEGIN
SELECT t.teamid
FROM TEAM t
WHERE t.teamid > 0
END
ELSE
BEGIN
SELECT t.teamid
FROM TEAM t
WHERE t.teamid = @teamid
END
Run Code Online (Sandbox Code Playgroud)
使用动态SQL:
DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'SELECT t.teamid
FROM TEAM t
WHERE 1 = 1 '
SET @SQL = @SQL + CASE @teamid
WHEN 0 THEN ' AND t.teamid > 0 '
ELSE ' AND t.teamid = @teamid '
END
BEGIN
EXEC sp_EXECUTESQL @SQL N'@teamid INT', @teamid
END
Run Code Online (Sandbox Code Playgroud)
请注意sp_EXECUTESQL缓存查询计划,而EXEC则不会.阅读本文:http://www.sommarskog.se/dynamic_sql.html