我有一个包含以下内容的脚本:
UPDATE table
SET column to update = ?
WHERE condition = ?", "text to insert", "text to test condition"
由于某种原因,SQL没有执行甚至读取此行。当我拼错任何保留字或列名时,我没有收到错误。
但是,当我有
时UPDATE table
SET column to update = "text to insert"
WHERE Name = "text to test condition"
SQL的行为符合预期。
问题是第二种方法,它起作用,不足以满足我的需要。我错过了什么吗?
由于
答案 0 :(得分:1)
由于此标记为pyodbc
,因此我假设您尝试使用参数运行查询。您的代码可能应该是这样的:
pyodbc.execute(
"""
UPDATE table
SET column_to_update = ?
WHERE other_column = ?
""",
"text to put in column_to_update",
"text to test condition in other_column",
)
请注意,标有?
的参数必须绑定到数据类型对象(如列),以便绑定它们。参见:
https://github.com/mkleehammer/pyodbc/wiki/Getting-started#parameters
祝你好运!答案 1 :(得分:0)
我将假设你试图通过传递带有查询的变量来从某些客户端代码运行SQL查询,尽管我不确定这个或你可能使用的语言 - 请澄清并添加标签,以便我们提供帮助。
SQL Server不会像其他DBMS查询那样使用?
作为参数占位符(例如,SQLite以您尝试使用它们的方式使用?
)。相反,您需要让ORM工具为您声明变量,并使用它们,或者明确声明您自己的参数并将其传入。您还没有告诉我们您正在使用的开发环境或使用的方法您正在使用的SQL连接和ORM(如果有),但这里是一个快速示例,使用来自Dapper ORM的C#中非常出色的here,给定一个开放连接{{1} }:
conn
在后台,Dapper处理变量的映射和创建,这样SQL Server收到的实际SQL脚本更接近于此:
string val = "my value";
conn.Execute("insert MyTable (val) values(@val)", new {val});
// or: conn.Execute("insert MyTable (val) values(@val)", new {val = val});"
conn.Execute("update MyTable set val = @val where Id = @id", new {val, id = 1});
另一方面,如果您要直接使用-- first query:
declare @val nvarchar(max) = 'my value';
insert MyTable (val) values(@val);
-- second query:
declare @val nvarchar(max) = 'my value', @id int = 1;
update MyTable set val = @val where Id = @id
执行原始查询,请尝试这样的操作(相当于上面的第一个查询):
SqlConnection
无论你做什么,参数化你的参数,beware of SQL injection!
希望有所帮助。如果您想要一个更清晰的示例,请给我们一些代码,以说明您如何将查询传递给SQL连接以便执行。