我是 SQL 的新手,我不断收到以下 SQL 语句的错误:
SELECT Id,Name
FROM {PositionInCompany}
WHERE @AdvancedFilter
目前,我只是测试 AdvancedFilter 的默认情况,所以它被设置为“1 = 1”,应该从 PositionInCompany 返回所有的名称和 ID。
错误是附加的。我错过了什么?
科尔
这可能是因为正如你所说,它是一个字符串,将翻译成:
SELECT Id,Name FROM {PositionInCompany} WHERE '1=1'
sql 会读这只是一个字符串,它不会知道它是可以激发的东西。您可以将 AdvancedFilter 的值更改为其他值
@AdvancedFilter = 'test'
SELECT Id,Name FROM {PositionInCompany} WHERE 'test'=@AdvancedFilter
或使用的东西来动态构建查询
SQL 中的参数是数据的占位符。如果它们包含 SQL 代码,则该代码将被数据库忽略并被视为数据。
这就是为什么您不能将 SQL 块作为参数发送的原因,这也是您不能参数化标识符的原因。
如果需要动态 where 子句,则需要使用动态 SQL,但这通常会在性能和安全性方面产生成本。
但是,我怀疑您当前的 SQL 是错误的,假设FROM {PositionInCompany}
意味着您将表名连接成 sql 字符串(仅假设,因为您没有提供任何信息来显示)。
如果我的假设是正确的,你需要停止这样做,阅读SQL injection and how parameterized queries protects you from it,并了解这种形式的串联也容易受到 SQL 注入攻击。
在 SQL 中,不要寻找快捷方式。为特定的表编写特定的查询。这是唯一安全的方法,并且 99.9% 的时间具有最佳性能。
谢谢你的回复。
我在 Outsystems 中这样做,但我认为这是一个简单的 SQL 问题。但是,有一个简单的“Expand Inline”选项,需要选择它才能插入字符串语句。它现在工作正常。
问候,科尔
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(50条)