Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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 server VBA-SQL查询字符串_Sql Server_Vba_Excel - Fatal编程技术网

Sql server VBA-SQL查询字符串

Sql server VBA-SQL查询字符串,sql-server,vba,excel,Sql Server,Vba,Excel,我声明了存储SQL表中列名称的变量,以及存储相应“要查找的值”的变量 Dim sColumn1作为字符串 作为字符串的Dim sColumn2 作为字符串的Dim sColumn3 将sValue1设置为字符串 将sValue2设置为字符串 将sValue3设置为字符串 sColumn1=表(1).范围(“A1”).值 sColumn2=表(1).范围(“B1”).值 sColumn3=表(1).范围(“C1”).值 sValue1=图纸(1).范围(“A2”).值 sValue2=图纸(1).

我声明了存储SQL表中列名称的变量,以及存储相应“要查找的值”的变量

Dim sColumn1作为字符串
作为字符串的Dim sColumn2
作为字符串的Dim sColumn3
将sValue1设置为字符串
将sValue2设置为字符串
将sValue3设置为字符串
sColumn1=表(1).范围(“A1”).值
sColumn2=表(1).范围(“B1”).值
sColumn3=表(1).范围(“C1”).值
sValue1=图纸(1).范围(“A2”).值
sValue2=图纸(1).范围(“B2”).值
sValue3=表(1).范围(“C2”).值
我想进行如下动态查询:

StrQuery=“从dbo.Table1中选择*,其中(“&sColumn1&”)类似(“&sValue1&”)和(“&sColumn2&”)类似(“&sValue2&”)和(“&sColumn3&”)类似(“&sValue3&”)
此代码不会生成任何错误,但也不会提取任何记录。我已经确认,所有变量都被分配了正确的值

如果我将列变量替换为SQL表中的实际列名,则上述查询可以正常工作。像这样:

StrQuery=“从dbo.Table1中选择*,其中Column1 LIKE(“&sValue&”)和Column2 LIKE(“&sValue2&”)以及Column3 LIKE(“&sValue3&”)”
使用这个字符串,我得到的结果没有任何问题,但列将是动态的。用户将从15个栏目中进行选择

为什么当我使用变量时,即使我知道变量的值与SQL表中列的名称完全匹配,它也不起作用


我是否在字符串中使用了错误的格式,因此它会读取存储在变量中的实际值?

上面关于使用参数化查询的警告仍然适用,但这是如何实现的:

StrQuery=“从dbo.Table1中选择*WHERE”&_
sColumn1&“LIKE(“%”和sValue&“%”)&_
和“&sColumn2&”LIKE(“%”和“sValue2&“%”)和_
和“&sColumn3&”LIKE(“%”和“%sValue3&%”)

如果输入有效,@TimWilliams的回答应该解决无法获得任何结果的问题。但是,正如注释中所述,代码有点脆弱,因为在工作表的字段中输入格式错误或不适当的值可能会产生有趣的结果。因此,我想建议一种比简单执行SQL字符串更健壮的方法

如果使用ADO与SQL Server对话,则可以调用SQL Server上的存储过程,如中所述。此外,如果您至少在SQLServer2008上,还有存储过程。此存储过程允许您执行包含参数的SQL字符串。第一个参数是SQL字符串,第二个参数是包含参数列表的字符串,以下参数是查询的实际参数。这允许您将表示相似模式的字符串作为实际字符串参数传入。因此,无论值是什么,它们都不能破坏查询本身

关于列名,至少应使用方括号对其进行转义。这是不防水的,但对于意外的错误值,它已经走了很长的路

结果会是这样

sqlString = "SELECT * FROM dbo.Table1 " & _
            "WHERE [" & sColumn1 & "] LIKE @value1 " & _
            "    AND [" & sColumn2 & "] LIKE @value2 " & _
            "    AND [" & sColumn3 & "] LIKE @value3 "

parameterDeclarationString = "@value1 AS NVARCHAR(1000)," & _
                             "@value2 AS NVARCHAR(1000)," & _
                             "@value3 AS NVARCHAR(1000)"

请注意,参数的最大长度只是合理上限的任意猜测。

为什么要将列放在单引号中?您需要阅读、理解并开始使用参数化查询。这对sql注入是完全开放的。我的朋友bobby tables喜欢这种编码方式。为了补充@MarkPM所说的内容,当您将列名放在单引号内时,它们将变成字符串文字。这不是您想要的,您需要查看列中的值。:)@弗洛伦特B。SQL注入不仅仅是为了安全。请询问O'Neil先生和Null夫人。说清楚:VBA代码处理发送到数据库的SQL语句中的一个模糊语法错误。“我们不需要防止SQL注入”是错误的——任何易受攻击的代码都是等待崩溃的代码,无论是在PHP、Java、C#、…还是VBA中。正确的操作非常简单,我无法找到一个理由来延续这种观念,即在任何情况下,尤其是在这个网站上,串联用户输入都是可以接受的。谢谢你的帮助!很抱歉,我没有早点回复。工作中发生了很多变化。该项目已被搁置。现在我回到这里,我肯定会重写这部分代码来实现参数化查询。谢谢!!谢谢你的帮助!很抱歉,我没有早点回复。工作中发生了很多变化。该项目已被搁置。现在我回到这里,我肯定会重写这部分代码来实现参数化查询。不过,这个指令似乎并没有解决这个问题。查询没有生成任何错误,但也没有结果。不过非常感谢!!