所以我想将几个值传递给存储过程。然后基于这些值,添加到一个变量,然后将其设置为我的where子句。但我难倒和谷歌帮助。这就是我的想法
CREATE PROCEDURE sp_RunReport @TransType varchar(255), @Accounts varchar(75)
AS
--declare a varchar WHERE clause variable here
IF @TransType <> ''
--add to WHERE clause variable
iF @Accounts <>''
--add to WHERE clause variable
SELECT *
FROM log
WHERE --my WHERE clause
GO
我看不出这是怎么可能的。我可以在前端的c sharp中完成所有操作,但我觉得它应该完成并且可以在存储过程中完成。任何帮助将不胜感激
答案 0 :(得分:1)
虽然上一个答案中的动态SQL可能还不错,但我建议使用这种“纯粹的”SQL方法
WHERE TransType = ISNULL(@TransType, TransType)
AND Accounts = ISNULL(@Accounts, Accounts)
通过摆脱ISULL来优化性能还有一些空间(在WHERE子句中使用时不是最佳的),但这应该可以让你有所了解。
当然,AND
你的逻辑的受ins可能需要OR
,你还需要确保params“正确”为空(在我的情况下为NULL或任何构成“空”的内容如果你重写这个以删除ISNULL)
答案 1 :(得分:0)
您可以使用EXEC
:
CREATE PROCEDURE sp_RunReport @TransType varchar(255), @Accounts varchar(75)
AS
DECLARE @where VARCHAR(4000) = ' WHERE 1=1'
DECLARE @sql NVARCHAR(4000)
IF @TransType <> ''
SET @where = @where + ' AND TransType = ''' + @TransType + ''''
IF @Accounts <>''
SET @where = @where + ' AND Accounts = ''' + @Accounts + ''''
SET @sql = 'SELECT *
FROM log' + @where
exec (@sql)
或使用推荐的sp_executesql
:
CREATE PROCEDURE sp_RunReport @TransType varchar(255), @Accounts varchar(75)
AS
DECLARE @where NVARCHAR(4000) = N' WHERE 1=1'
DECLARE @sql NVARCHAR(4000)
DECLARE @ParmDefinition nvarchar(500) = N'@TransType varchar(255), @Accounts varchar(75)'
IF @TransType <> ''
SET @where = @where + N' AND TransType = @TransType'
IF @Accounts <>''
SET @where = @where + N' AND Accounts = @Accounts'
SET @sql = N'SELECT *
FROM log' + @where
EXECUTE sp_executesql @sql, @ParmDefinition,
@TransType = @TransType, @Accounts = @Accounts