您好我想创建一个简单的存储proecudre,它执行以下操作:
Psudocode
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
这种方法有效吗?谢谢。
答案 0 :(得分:10)
尝试
select *
from table
where id=isnull(@param, id)
答案 1 :(得分:1)
从表中选择* Where(ID = @Param或@Param为null)
或者
从表中选择* 其中ID = Coalesce(@Param,ID)
[如果您的目标是提高效率,请将*替换为您想要返回的特定字段。]
答案 2 :(得分:0)
是的 - 我当然没有看到它有任何问题。你可以让它变得更简单:
Set NOCOUNT On;
if (@Param is NULL)
Select * From Table;
else
Select * From Table Where (ID=@Param);
注意:我可能会拼出这些字段。
答案 3 :(得分:0)
根据具体情况,我可能会使用动态SQL。
但是,如果@param来自用户,你需要记住SQL注入,这就是为什么你不应该直接向你的sql添加参数。
在t-sql中,它看起来像是(从我的头脑中未经测试;):
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'
SELECT ...
FROM table t
WHERE 1 = 1' (
IF(@param IS NOT NULL)
SET @SQL = @SQL + '
AND t.id = @id'
... possibly more things added to the query ...
EXEC sp_executesql
@SQL
, '@id AS INT'
, @id = @Param
通过这样做,您将获得针对每种情况的优化查询计划(并且通过使用sp_executesql,也将使用查询缓存)
我会特别避免使用OR解决方案,如果你检查使用OR生成的查询计划与没有生成的查询计划相比,你会理解为什么。
答案 4 :(得分:0)
试试这段代码:
CREATE PROCEDURE [dbo].[ProcedureName]
@Param varchar(50)
AS
BEGIN
declare @tempSelect nvarchar(max)
SET NOCOUNT ON;
set @tempSelect = 'SELECT Col1, Col2 FROM Table where Col1 <> '' '
if @Param <> ''
begin
set @resultSet = @resultSet + ''' and Col1='''+@Param1
end
EXEC(@resultSet)
END