【问题标题】:How to pass the actual where clause to SQL function?如何将实际的 where 子句传递给 SQL 函数?
【发布时间】:2015-11-01 21:13:15
【问题描述】:

这是我正在尝试创建的功能

CREATE FUNCTION fnGetValue
(
     @WhereClause VARCHAR(256)
)
RETURNS TABLE
AS
RETURN
     SELECT A.Name, B.Value
     FROM A
     INNER JOIN B ON A.Akey = B.AKey
     WHERE + @WhereClause +
GO

参数@WhereClause 是从我的PHP 构建的,类似于

A.Akey IN (2,3) 

但是当我尝试这个时,我得到了这个错误

在预期条件的上下文中指定的非布尔类型表达式,靠近“AND”。

我想让大家知道,我知道查询是错误的,因为 SQL 需要一个可以评估为布尔值的表达式。但我的问题是如何实现我正在努力的目标。请帮帮我。

【问题讨论】:

  • 为什么要在 SQL 中为此创建函数?为什么不创建 PHP 函数?
  • @Mr.P 这样它就可以在 C++ 等软件的其他部分使用。当然,我可以从 C++ 调用 PHP 函数,但我认为从长远来看,数据库中的函数会更加清晰和容易。
  • 如果你打算传递整个where 子句,那么创建一个函数没有多大意义:你应该只创建一个视图并执行select * from view where (where clause here)
  • @user1429322 是 MySQL 吗?
  • 你不应该在这里使用动态 SQL 查询吗?

标签: sql sql-server


【解决方案1】:

创建动态查询来解决这个问题。 以下是有效的查询

创建函数 fnGetValue(@WhereClause VARCHAR(256)) 返回@值表 ( 名称 varchar(50), 价值整数 ) 作为 开始 声明 @Query varchar(2000) set @Query='INSERT INTO @value SELECT A.Name, B.Value FROM A INNER JOIN B ON A.Akey = B.AKey WHERE' + @WhereClause execute(@Query) RETURN

【讨论】:

  • 函数中不允许使用动态 SQL。
【解决方案2】:

您可以使用 excute 命令以字符串格式运行查询。 在您的情况下,您的函数体应该是

DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT A.Name, B.Value FROM A INNER JOIN B ON A.Akey = B.AKey WHERE ' + @WhereClause;
EXECUTE(@query);

希望这能解决您的问题。

【讨论】:

  • 函数中不允许使用动态 SQL。
【解决方案3】:

这里where clause是动态发送的,所以你必须使用dynamic sql

这里的一个限制是function,您不能使用dynamic sql

只能执行函数和一些扩展存储过程 从函数内部。

见 ==> Getting an error when executing a dynamic sql within a function (SQL Server)?

您可以在这里使用类似的程序

CREATE procedure fnGetValue (
     @WhereClause VARCHAR(256)
)
AS
    declare @sql NVARCHAR(1000) =
        'SELECT A.Name, B.Value
        FROM A
        INNER JOIN B ON A.Akey = B.AKey
        WHERE ' + @WhereClause
EXEC sp_executesql @sql
return
GO

那么,

exec fnGetValue 'any condition'

【讨论】:

  • 如果不是出于安全考虑,我会接受这个答案。当我发布问题时,这就是我所期待的答案。
【解决方案4】:

我认为最好在 PHP 中构建 SQL 函数并调用它。使用您的方法很难保证查询中的内容,它只是要求进行 SQL 注入攻击。

使用类似于(但不一定)Laravel 的东西将有助于构建查询,它还可以解决与动态创建查询相关的一些安全问题。

如果您决心这样做,您可以尝试question 中的建议。

【讨论】:

  • 如果他会过滤输入,则不一定使用 SQLi .. 但是是的,这是可能的,我也建议不要使用这个解决方案.. +1
  • 关于 SQL 注入和安全问题的要点。我在 PHP 中构建了查询,并在必要时从 C++ 调用了这个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多