声明并连接sql中的变量

时间:2014-01-26 04:42:35

标签: sql sql-server stored-procedures

所以我想将几个值传递给存储过程。然后基于这些值,添加到一个变量,然后将其设置为我的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中完成所有操作,但我觉得它应该完成并且可以在存储过程中完成。任何帮助将不胜感激

2 个答案:

答案 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

来使用动态SQL
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