这是我正在尝试创建的功能
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的表达式。但我的问题是如何实现我想要的东西。请帮帮我。
答案 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>
希望这能解决您的问题。