3

我将 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'

请帮助我如何实现这一目标。

4

2 回答 2

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:

执行(@Sql)

于 2012-10-30T14:57:08.057 回答
0

Abe 的回答是正确的,如果您将动态 SQL 查询构建为 varchar,如果这只是一个 1-off 问题,您可以通过 EXEC(@varname) 执行它。

您可以考虑在 ASE 15 中使用 XML 功能。实际上,我们曾经针对深入的业务规则引擎进行了完全相同的练习,并且完全确定使用 ASE 15 中的 xml 功能来合并计算列、case 语句和数据库中 XML 文本内的 where 子句。

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

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

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

于 2012-11-06T05:07:16.187 回答