具有下表
table TableAB(
ColumnA int,
ColumnB nvarchar(50)
)
我需要创建一个过程,该过程返回 ColumnA , ColumnB 并接受两个参数(在现实生活中,参数数量超过20)。所有搜索都应使用通配符“%”。
procedure has input parameters
@ColumnA int,
@ColumnB nvarchar(50)
我有两种方法
1。
select ColumnA,ColumnB from TableAB
where
ColumnA like
case @ColumnA
when @ColumnA NULL then ColumnA
else '%' + CONVERT(varchar(10),@ColumnA)+'%'
end
and
ColumnB like
case @ColumnB
when @ColumnB NULL then ColumnB
else '%' + ColumnB +'%'
end
2。
DECLARE @TabWhereConditions TABLE(Id INT IDENTITY(1,1), Condition VARCHAR(MAX))
...
SET @ParamDefenition = '@pColumnA int, @pColumnB nvarchar(50)'
IF(NOT @ColumnA IS NULL)
BEGIN
INSERT INTO @TabWhereConditions(Condition)
VALUES('ColumnA like ' + '''%' + CONVERT(varchar(10),@ColumnA) + '%''')
END
IF(NOT @ColumnB IS NULL)
BEGIN
INSERT INTO @TabWhereConditions(Condition)
VALUES('ColumnA like ' + '''%' + @ColumnB + '%''')
END
DECLARE CondCursor CURSOR FOR
SELECT Condition FROM @TabWhereConditions
OPEN CondCursor
SET @WhereString = ''
FETCH NEXT FROM CondCursor INTO @WhereCondition
WHILE @@FETCH_STATUS = 0
BEGIN
SET @WhereString = @WhereString + @WhereCondition + ' AND '
FETCH NEXT FROM CondCursor INTO @WhereCondition
END
CLOSE CondCursor
DEALLOCATE CondCursor
SET @WhereString = SUBSTRING(@WhereString,1, LEN(@WhereString)-4)
SET @SqlCommand = '
SELECT
ColumnA,
ColumnB
FROM TableAB
WHERE ' + @WhereString
EXECUTE sp_executesql @SqlCommand, @ParamDefenition,
@pColumnA = @ColumnA,
@pColumnB = @ColumnB,
哪种方法更好?第一或第二,或您的建议 注意:对于过程可能需要1到20个参数,每个调用可以获取不同数量的参数的情况,我需要解决方案
答案 0 :(得分:3)
我相信您想沿着这些思路使用一些东西
select ColumnA,ColumnB from TableAB
where (@columnA is null or ColumnA like '%'+CONVERT(varchar(10),@ColumnA)+'%' and
(@columnB is null or ColumnB like '%'+CONVERT(varchar(10),@ColumnB)+'%'
如this Aaron Bertrand博客文章中所述,使其成为动态T-SQL是一个好主意。因此,您可以使用sys.sp_executesql
来运行上面的语句。
答案 1 :(得分:2)
在有多个where条件的情况下,您可以创建执行存储过程或查询,如下所示。
0
希望这会对您有所帮助。