script不起作用

umuewwlo  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(288)

我试图创建一个存储过程,它接收一个字符串并将其放入 WHERE 处理后的子句。
我创建了函数,当我从sql语句体调用它时,它返回正确的值:

('J1245',j3456','j1098')

但是,当我调用 WHERE 子句,sql不显示任何记录。

(Altcode in dbo.myfunction(@codes))

当我在 WHERE 子句中,sql语句显示记录。

(Altcode IN ('J1245',j3456','j1098'))
pvabu6sv

pvabu6sv1#

我怀疑函数返回的是字符串(varchar)。如果我们在sql语句中的任意位置引用函数,则函数返回的值将用作标量值。值的内容不会改变这一点。任何出现在字符串中的标点、单引号、倒钩、双引号、逗号、关键字、标识符等都只是值的一部分。
解析器将函数的返回仅仅看作一个值,而不是sql文本的一部分。
不可能(在单个语句中)使函数返回的值“成为”要分析的sql文本的一部分。
例如,在 WHERE 条款,如果我们写:

WHERE altcode IN ( myfunc() )

函数 myfunc 将被求值,并且返回的是某个数据类型的单个值,例如varchar。值中的任何参数或逗号都不会解释为sql文本的一部分。这些只是值内的字符。
就像我们这样写sql:

WHERE altcode IN ( ? )

并提供了一个值来代替问号占位符。sql解析器没有看到值列表,也没有看到任何要执行的sql。语句所看到的只是一个值。
我们可能提供一个类似sql文本的值,这一点都不重要,例如:

WHERE altcode IN ( '(SELECT code FROM all_altcodes)' )

那就相当于写作

WHERE altcode = '(SELECT code FROM all_altcodes)'

这将寻找一个精确匹配的 altcode 字符串文本。
函数返回的值中似乎缺少一个引号,但这可能是问题中的一个输入错误。
要获取作为sql文本一部分包含的函数返回的字符串值,我们需要使用动态sql。
我们必须首先调用函数,然后返回字符串。然后做一些字符串连接,得到另一个包含我们要执行的sql语句的字符串,然后将该字符串作为sql语句执行。
所以这将是两个独立的语句执行。。。一种是得到函数值;以及第二个语句,该语句动态构造为字符串,包含函数返回的值。
(问题被标记为“mysql”,但我怀疑这个问题实际上是关于sqlserver的(考虑到 dbo. ?)
在mysql和sqlserver中准备和执行动态sql是相似的,但是在语法上有区别。

相关问题