我试图创建一个存储过程,它接收一个字符串并将其放入 WHERE 处理后的子句。我创建了函数,当我从sql语句体调用它时,它返回正确的值:
WHERE
('J1245',j3456','j1098')
但是,当我调用 WHERE 子句,sql不显示任何记录。
(Altcode in dbo.myfunction(@codes))
当我在 WHERE 子句中,sql语句显示记录。
(Altcode IN ('J1245',j3456','j1098'))
pvabu6sv1#
我怀疑函数返回的是字符串(varchar)。如果我们在sql语句中的任意位置引用函数,则函数返回的值将用作标量值。值的内容不会改变这一点。任何出现在字符串中的标点、单引号、倒钩、双引号、逗号、关键字、标识符等都只是值的一部分。解析器将函数的返回仅仅看作一个值,而不是sql文本的一部分。不可能(在单个语句中)使函数返回的值“成为”要分析的sql文本的一部分。例如,在 WHERE 条款,如果我们写:
WHERE altcode IN ( myfunc() )
函数 myfunc 将被求值,并且返回的是某个数据类型的单个值,例如varchar。值中的任何参数或逗号都不会解释为sql文本的一部分。这些只是值内的字符。就像我们这样写sql:
myfunc
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是相似的,但是在语法上有区别。
altcode
dbo.
1条答案
按热度按时间pvabu6sv1#
我怀疑函数返回的是字符串(varchar)。如果我们在sql语句中的任意位置引用函数,则函数返回的值将用作标量值。值的内容不会改变这一点。任何出现在字符串中的标点、单引号、倒钩、双引号、逗号、关键字、标识符等都只是值的一部分。
解析器将函数的返回仅仅看作一个值,而不是sql文本的一部分。
不可能(在单个语句中)使函数返回的值“成为”要分析的sql文本的一部分。
例如,在
WHERE
条款,如果我们写:函数
myfunc
将被求值,并且返回的是某个数据类型的单个值,例如varchar。值中的任何参数或逗号都不会解释为sql文本的一部分。这些只是值内的字符。就像我们这样写sql:
并提供了一个值来代替问号占位符。sql解析器没有看到值列表,也没有看到任何要执行的sql。语句所看到的只是一个值。
我们可能提供一个类似sql文本的值,这一点都不重要,例如:
那就相当于写作
这将寻找一个精确匹配的
altcode
字符串文本。函数返回的值中似乎缺少一个引号,但这可能是问题中的一个输入错误。
要获取作为sql文本一部分包含的函数返回的字符串值,我们需要使用动态sql。
我们必须首先调用函数,然后返回字符串。然后做一些字符串连接,得到另一个包含我们要执行的sql语句的字符串,然后将该字符串作为sql语句执行。
所以这将是两个独立的语句执行。。。一种是得到函数值;以及第二个语句,该语句动态构造为字符串,包含函数返回的值。
(问题被标记为“mysql”,但我怀疑这个问题实际上是关于sqlserver的(考虑到
dbo.
?)在mysql和sqlserver中准备和执行动态sql是相似的,但是在语法上有区别。