在Sybase SQL查询中,是否可以用字符串变量替换where子句?

在Sybase SQL查询中,是否可以用字符串变量替换where子句?,sql,stored-procedures,sybase,Sql,Stored Procedures,Sybase,我有两个存储过程,它们具有不同的输入签名,但在其他方面是相同的,并且希望合并它们。我试图模拟重载签名,然后测试哪个输入变量为null,以适当地设置最终的where子句。我还没有弄明白如何去引用字符串文字 程序: CREATE PROCEDURE get_providers (@p_id bigint) SELECT ... WHERE p.p_id = @p_id CREATE PROCEDURE get_providers (@ssn varchar(9)) SELECT ...

我有两个存储过程,它们具有不同的输入签名,但在其他方面是相同的,并且希望合并它们。我试图模拟重载签名,然后测试哪个输入变量为null,以适当地设置最终的where子句。我还没有弄明白如何去引用字符串文字

程序:

CREATE PROCEDURE get_providers (@p_id bigint)
SELECT
   ...
WHERE p.p_id = @p_id

CREATE PROCEDURE get_providers (@ssn varchar(9))
SELECT
   ...
WHERE p.ssn = @ssn
尝试添加此逻辑以设置动态WHERE子句:

CREATE PROCEDURE get_providers (@ssn varchar(9), @p_id bigint)

DECLARE @clause varchar(100);
SELECT clause = 'p.p_id = @provider_id';    

IF @ssn is null
select clause = 'p.ssn = @ssn';

SELECT
   ...
WHERE @clause
输出:

ERROR: SQL Anywhere Error -131: Syntax error near '(end of line)' 
on line 50 Error Code: 102 

注意:第50行是@clause

的位置。您可以构造一个完整的查询字符串并执行它。这里是一个示例

declare @sql nvarchar(max);
select @sql = '
select . . .
from . ..
@whereclause';

select @sql = replace(@sql, '@whereclause', coalesce('where ' + @clause, ''));

exec(@sql);

查询不能只有一部分是字符串。

您将Watcom SQL和t-SQL混为一谈。SA支持两者,但不能混合使用。 以下两项工作:

-- Watcom
begin
declare @c varchar(25);
set @c = "select @@version";
execute immediate @c;
end;


-- T-SQL
declare @c varchar(25)
set @c = "select @@version"
execute(@c)

为什么不使用带有两个select的if语句呢?select语句非常长…试图减少过程代码出于性能原因,它们还是作为两个语句更好,尤其是在存储过程中。谢谢,我尝试过了,但语法有问题。。。我运行select@@@version,返回16.0.0.1915,但是:declare@c varchar25 select@c=select@@@version exec@c返回:错误:SQL Anywhere错误-143:未找到列“select@@@version”错误代码:207