动态sybase存储过程中的条件

时间:2012-10-30 08:26:51

标签: sybase-ase

我在数据库表中存储where子句语句,之后我在select语句中使用和使用。

这是我的sybase查询,

"INSERT table(RUN_ID,RUN_DATE,GRGR_ID,SGSG_ID,COLUMN_NAME,ERROR_CODE)SELECT @pnRunId,getdate(),GRGR_ID,SGSG_ID,@COLUMN_NAME,@ERROR_CODE from table1_exct where + @WHERE_CLAUSE"

@WHERE_CLAUSE = '@IKA_COLUMN_NAME IS NOT NULL'

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

我觉得你可以插入你的where子句但不知道如何运行它们。

那将是艰难但并非不可能。您必须使用游标或循环在VARCHAR中构建一段Sql。

declare @Sql VARCHAR(2000)

select @Sql = 'INSERT table(RUN_ID,RUN_DATE,GRGR_ID,SGSG_ID,COLUMN_NAME,ERROR_CODE)SELECT @pnRunId,getdate(),GRGR_ID,SGSG_ID,@COLUMN_NAME,@ERROR_CODE from table1_exct where ' 

while 1 = 1 
begin
    declare @claus VARCHAR(200)
    SET ROWCOUNT 1
    SELECT @claus = where_clause from some_table
    select @sql = @sql + @claus
    delete some_table where where_clause = @claus
    set rowcount 0
end

这有两件事需要考虑 - 它没有为第一个和后续子句提供WHERE和AND(我确信你可以这样做),它会从源代码中删除你的where子句(你可以得到)将它们全部放入临时标签中以便绕过它。)

如果你的子句都在同一列上,你可以在一列中有一个LIKE表达式列表,并使用LIKE运算符连接到它 - 这可能很方便。

无论如何,在上面结束时,运行sql:

EXEC(@sql)

答案 1 :(得分:0)

Abe的答案是正确的,如果您将动态SQL查询构建为varchar,则可以通过EXEC(@varname)执行此操作,如果这只是一次性问题。

你可以考虑在ASE 15中使用XML功能。我们实际上在一个点上对一个深入的业务规则引擎进行了完全相同的练习,并且使用ASE 15中的xml特性来合并计算列, case语句和DB中XML文本中的where子句。

以下是一些信息http://www.sypron.nl/xml.html

所以,我相信像这样的解决方案可以比动态SQL更优雅地解决您的问题。

我们最终没有使用它,因为我们无法在生产中启用XML支持(传统的2k页面问题)......但是如果您的问题足够大以支持实现某些工作的工作量,我觉得这可以解决您的问题可以使用它(我们最终只使用java。)