您好我想创建一个简单的存储过程,它执行以下操作:
伪代码
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
这种方法有效吗?谢谢你。
您好我想创建一个简单的存储过程,它执行以下操作:
伪代码
@tempSelect = "SELECT * FROM Table"
if (@Param is NULL) then
exec @tempSelect
else
exec @tempSelect + ' WHERE id = ' + @Param + '
这种方法有效吗?谢谢你。
尝试
select *
from table
where id=isnull(@param, id)
Select * from Table where (ID = @Param or @Param is null)
或者
从 ID=Coalesce(@Param, ID) 的表中选择 *
[如果您的目标是效率,请将 * 替换为您要返回的特定字段。]
是的——我当然认为它没有任何问题。你可以让它变得更简单:
Set NOCOUNT On;
if (@Param is NULL)
Select * From Table;
else
Select * From Table Where (ID=@Param);
注意:不过,我可能会拼出这些字段。
根据具体情况,我可能会使用动态 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 生成的查询计划与不使用 OR 生成的查询计划相比,您就会明白为什么。
试试这个代码:
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