如何将实际的where子句传递给SQL函数?

时间:2015-08-10 03:50:18

标签: sql sql-server

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

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期望一个可以计算为boolean的表达式。但我的问题是如何实现我想要的东西。请帮帮我。

4 个答案:

答案 0 :(得分:2)

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

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

如果你决定这样做,你可以尝试这个question中的建议。

答案 1 :(得分:1)

此处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'

答案 2 :(得分:0)

创建动态查询以解决此问题。 Folowing是可行的查询

CREATE FUNCTION fnGetValue( @WhereClause VARCHAR(256))
RETURNS @value TABLE
    (
    Name varchar(50),
    value int
    )
AS
BEGIN
    DECLARE @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

答案 3 :(得分:-1)

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

  <!DOCTYPE html>
  <html>
   <body>

<p>Click the button to demonstrate the prompt box.</p>

 <button onclick="myFunction()">Try it</button>

 <p id="demo"></p>

  <script>
  function myFunction() {
 while(true)
       {
   var person = prompt("Please enter your name");
    }  
   var i=0;
     while(i<person.length)
     {
     if (person[i] != null) {
     document.getElementById("demo").innerHTML =person[i]
     }
    i++;
       }
     }
      </script>

    </body>
      </html>

希望这能解决您的问题。