Moh*_*kim 4 sql sql-server stored-procedures dynamic-sql where-clause
我想基于存储过程输入构建自定义Where条件,如果不是null,那么我将在语句中使用它们,否则我将不使用它们.
if @Vendor_Name is not null
begin
set @where += 'Upper(vendors.VENDOR_NAME) LIKE "%"+ UPPER(@Vendor_Name) +"%"'
end
else if @Entity is not null
begin
set @where += 'AND headers.ORG_ID = @Entity'
end
select * from table_name where @where
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误
An expression of non-boolean type specified in a context where a condition is expected, near 'set'.
Run Code Online (Sandbox Code Playgroud)
用这个 :
Declare @Where NVARCHAR(MAX)
...... Create your Where
DECLARE @Command NVARCHAR(MAX)
Set @Command = 'Select * From SEM.tblMeasureCatalog AS MC ' ;
If( @Where <> '' )
Set @Comand = @Command + ' Where ' + @Where
Execute SP_ExecuteSQL @Command
Run Code Online (Sandbox Code Playgroud)
我测试了这个并且它有效
您不能像在此行中那样简单地将变量放在普通SQL中:
select * from table_name where @where;
Run Code Online (Sandbox Code Playgroud)
您需要使用动态SQL.所以你可能有类似的东西:
DECLARE @SQL NVARCHAR(MAX) = 'SELECT * FROM Table_Name WHERE 1 = 1 ';
DECLARE @Params NVARCHAR(MAX) = '';
IF @Vendor_Name IS NOT NULL
BEGIN
SET @SQL += ' AND UPPER(vendors.VENDOR_NAME) LIKE ''%'' + UPPER(@VendorNameParam) + ''%''';
END
ELSE IF @Entity IS NOT NULL
BEGIN
SET @SQL += ' AND headers.ORG_ID = @EntityParam';
END;
EXECUTE SP_EXECUTESQL @SQL, N'@VendorNameParam VARCHAR(50), @EntityParam INT',
@VendorNameParam = @Vendor_Name, @EntityParam = @Entity;
Run Code Online (Sandbox Code Playgroud)
我假设您的实际问题更复杂,并且已经为此简化了它,但是如果使用所有谓词添加IF .. ELSE IF.. ELSE IF,那么您根本不需要动态SQL,您可以使用:
IF @Vendor_Name IS NOT NULL
BEGIN
SELECT *
FROM Table_Name
WHERE UPPER(vendors.VENDOR_NAME) LIKE '%' + UPPER(@Vendor_Name) + '%';
END
ELSE IF @Entity IS NOT NULL
BEGIN
SELECT *
FROM Table_Name
WHERE headers.ORG_ID = @Entity;
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24317 次 |
| 最近记录: |