Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本SQL语句返回错误_Sql - Fatal编程技术网

基本SQL语句返回错误

基本SQL语句返回错误,sql,Sql,我是SQL新手,我不断收到以下SQL语句的错误: SELECT Id,Name FROM {PositionInCompany} WHERE @AdvancedFilter 目前,我正在测试AdvancedFilter的默认情况,因此它被设置为“1=1”,并且应该返回来自PositionCompany的所有名称和ID。 如果我只是简单地将“1=1”放进去,这是可行的,但如果我使用变量(它具有完全相同的字符串值),则不可行 错误已附加。 我错过了什么 科尔 这可能是因为正如您所说,它是一个字符串

我是SQL新手,我不断收到以下SQL语句的错误:

SELECT Id,Name
FROM {PositionInCompany}
WHERE @AdvancedFilter
目前,我正在测试AdvancedFilter的默认情况,因此它被设置为“1=1”,并且应该返回来自PositionCompany的所有名称和ID。 如果我只是简单地将“1=1”放进去,这是可行的,但如果我使用变量(它具有完全相同的字符串值),则不可行

错误已附加。 我错过了什么

科尔


这可能是因为正如您所说,它是一个字符串,将转换为:

SELECT Id,Name FROM {PositionInCompany} WHERE '1=1'
sql会将其理解为一个字符串,它不会知道它是可以执行的。 您可以将AdvancedFilter的值更改为其他值

@AdvancedFilter = 'test'
SELECT Id,Name FROM {PositionInCompany} WHERE 'test'=@AdvancedFilter

或者使用某些东西动态构建查询

这可能是因为正如您所说的,它是一个字符串,将转换为:

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{positioncompany}
意味着您正在将表名连接到SQL字符串中(仅假设,因为您没有提供任何信息来显示这一点)

如果我的假设是正确的,您需要停止这样做,阅读并了解这种形式的连接也容易受到SQL注入攻击


在SQL中,不要寻找快捷方式。为特定表编写特定查询。这是唯一安全的方法,99.9%的时间它具有最佳性能。

SQL中的参数是数据的占位符。如果它们包含SQL代码,则数据库将忽略该代码并将其视为数据。
这就是为什么不能将SQL块作为参数发送,这也是为什么不能参数化标识符

如果需要动态where子句,则需要使用动态SQL,但这通常会降低性能和安全性

但是,首先我怀疑您当前的SQL是错误的,假设
FROM{positioncompany}
意味着您正在将表名连接到SQL字符串中(仅假设,因为您没有提供任何信息来显示这一点)

如果我的假设是正确的,您需要停止这样做,阅读并了解这种形式的连接也容易受到SQL注入攻击


在SQL中,不要寻找快捷方式。为特定表编写特定查询。这是唯一安全的方法,99.9%的情况下它的性能最好。

感谢您的回复

我在Outsystems中这样做,但我认为这是一个简单的SQL问题。 然而,只有一个“expandinline”选项需要被选中才能插入string语句。现在很好用

问候,,
科尔

感谢您的回复

我在Outsystems中这样做,但我认为这是一个简单的SQL问题。 然而,只有一个“expandinline”选项需要被选中才能插入string语句。现在很好用

问候,,
Cole

请阅读SQLS的任何基本介绍。变量或参数的目的是包含数据值。不是任意的代码块。您是否熟悉任何一种语言,如果您有一个字符串变量,
t
包含值
a==B
,则允许您编写
if(t)
,它将评估
a
B
是否相等?我所熟悉的大多数语言都不允许这样做,而t-SQL在这方面并不引人注目<代码>“忘了它吧。如果您这样做,您还没有完成使用存储过程的转换,您仍然在客户机中组装SQL代码。”另外,表名似乎已模板化。这样写代码真是个坏主意。这个错误与您的查询不匹配。请包含准确的错误和准确的查询。此外,不要使用错误或文本的屏幕截图——只需将文本直接复制并粘贴到问题中。请阅读任何基本的SQL简介。变量或参数的目的是包含数据值。不是任意的代码块。您是否熟悉任何一种语言,如果您有一个字符串变量,
t
包含值
a==B
,则允许您编写
if(t)
,它将评估
a
B
是否相等?我所熟悉的大多数语言都不允许这样做,而t-SQL在这方面并不引人注目<代码>“忘了它吧。如果您这样做,您还没有完成使用存储过程的转换,您仍然在客户机中组装SQL代码。”另外,表名似乎已模板化。这样写代码真是个坏主意。这个错误与您的查询不匹配。请包括准确的错误和准确的查询。另外,不要使用错误或文本的屏幕截图——只需将文本直接复制并粘贴到问题中即可。