在查询中执行动态sql

时间:2014-12-09 09:27:43

标签: sql sql-server function dynamic

我想有这样的查询

SELECT
    param1,
    param2,
    param3,
    getHidden(param1, param3)
FROM xxx

我的函数必须构建动态查询,执行它并返回0或1。

CREATE FUNCTION getHidden (@param1 VARCHAR(50), @param2 INT) RETURNS INT AS
BEGIN
    DECLARE @firstSelect VARCHAR(200);
    DECLARE @query VARCHAR(1000);
    SELECT @firstSelect = restriction FROM xxxx WHERE param1 = @param1 AND param2
    SET @query = 'SELECT (CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END) FROM xxx WHERE ' + @firstSelect;
    -- EXEC @query?
    RETURN 1
END

我在动态查询执行中遇阻,是否有解决此问题的解决方法?

THX, 杰里米

编辑:详情 在jasper ireport中,我必须进行查询(只有一个),该查询应该能够返回并显示问题列表。 在数据库中,每行都有一个问题,可能有一个限制字段。该字段包含WHERE约束(内容示例:BEIE_Emp_Nb = 0) 在我的php程序中,我使用此字段来构建我的查询。我的最终查询将是:

SELECT param1, param2 FROM questions WHERE 1 = 1 AND $constraint
这给了我 SELECT param1, param2 FROM questions WHERE 1 = 1 AND BEIE_Emp_Nb = 0

我不知道这是否足够清楚。问题在于我必须查询约束字段以查找实际问题,然后构建我的查询并返回结果。

2 个答案:

答案 0 :(得分:1)

您无法在SQL Server函数中调用存储过程,如sp_executesql。 这意味着您无法在函数内定义和执行动态SQL代码。 原因是函数不允许有副作用(比如调用自己和更改数据或参数,因为您正在使用动态SQL查询,并执行类似INSERT,DELETE的操作)或更新)。

只有存储过程可以调用函数,而不是相反。检查here功能的限制和限制。 然后,您应该创建一个存储过程而不是函数来解决您的问题。

答案 1 :(得分:0)

要执行动态查询,请将EXEC与输出变量一起使用。

DECLARE @nResult INT

EXEC sp_executesql @query, N'@nResultNew INTEGER OUTPUT', @nResult OUTPUT

RETURN @nResult