Sql server select语句中的golang/sqlserver位置参数
任何人都可以使用golang sqlserver驱动程序提供一个简单的select和2个(或更多)位置参数的查询或QueryRow(不是QueryContext)的工作示例吗 显然,有一些搅动: 给出的唯一示例代码是QueryContext,它对于简单的cli数据转换程序来说是超复杂的。这对于postgres或mysql来说非常简单,但对于sql server,我简直是束手无策 使用:Sql server select语句中的golang/sqlserver位置参数,sql-server,go,Sql Server,Go,任何人都可以使用golang sqlserver驱动程序提供一个简单的select和2个(或更多)位置参数的查询或QueryRow(不是QueryContext)的工作示例吗 显然,有一些搅动: 给出的唯一示例代码是QueryContext,它对于简单的cli数据转换程序来说是超复杂的。这对于postgres或mysql来说非常简单,但对于sql server,我简直是束手无策 使用: var checkQuery = "select SigCode from @LRU where LRUEmu
var checkQuery = "select SigCode from @LRU where LRUEmu=@ENVVAR"
...
rows, err := db.Query(checkQuery, sql.Named("LRU", string1), sql.Named("ENVVAR", string2))
收益率:
application()行.Query()失败:mssql:必须声明表变量“@LRU”。
编辑。根据下面的@Flimzy,使用QueryContext重试:
行,err:=db.QueryContext(context.TODO(),checkQuery,sql.Named(“LRU”,string1),sql.Named(“ENVVAR”,string2))
同样的错误
@MWillemse:以下是一些示例代码(pymssql),它使用变量指定目标表:
slice_cursor.execute(
"select distinct Subsystem, Field from [%(dlog)s] "
"where Subsystem not like 'STRING1' "
"order by Subsystem, Field"
% {
'dlog' : datelog
}
)
我总是这样做。在golang/pg中,效果也很好
@普图:我试过你的建议,但没有乐趣。新的错误,不过
var checkQuery = "DECLARE @LRU VARCHAR(255), @ENVVAR VARCHAR(255); select SigCode from @LRU where LRUEmu=@ENVVAR;"
// ...
rows, err := db.Query(checkQuery, sql.Named("LRU", string1), sql.Named("ENVVAR", string2))
收益率:
mssql:变量名'@LRU'已声明。变量名在查询批处理或存储过程中必须是唯一的。
我不知道golang,但我知道sql server
var checkQuery = "select SigCode from @LRU where LRUEmu=@ENVVAR"
rows, err := db.Query(checkQuery, sql.Named("LRU", string1), sql.Named("ENVVAR", string2))
这些行必须转换为SQL代码并发送到SQL server。生成的SQL代码可能如下所示:
DECLARE @LRU NVARCHAR(MAX) = '<contents of string 1>';
DECLARE @ENVAR NVARCHAR(MAX) = '<contents of string 2>';
select SigCode from @LRU where LRUEmu=@ENVVAR
var checkQuery =
"DECLARE @SQL NVARCHAR(MAX) =
'select SigCode from '+@LRU+' where LRUEmu=@ENVVAR';
EXEC(@SQL);"
rows, err := db.Query(checkQuery, sql.Named("LRU", string1), sql.Named("ENVVAR", string2))
它被您的QueryContext捕获并重新调用
SQL server引发错误的原因是查询中的语法错误。SQL server不允许(afaik和其他rdbms也不允许)将表名放入变量中并对其运行select
因此,您可以选择:
var checkQuery = "select SigCode from " + string1 + " where LRUEmu=@ENVVAR"
rows, err := db.Query(checkQuery, sql.Named("ENVVAR", string2))
或者像这样使用动态sql:
DECLARE @LRU NVARCHAR(MAX) = '<contents of string 1>';
DECLARE @ENVAR NVARCHAR(MAX) = '<contents of string 2>';
select SigCode from @LRU where LRUEmu=@ENVVAR
var checkQuery =
"DECLARE @SQL NVARCHAR(MAX) =
'select SigCode from '+@LRU+' where LRUEmu=@ENVVAR';
EXEC(@SQL);"
rows, err := db.Query(checkQuery, sql.Named("LRU", string1), sql.Named("ENVVAR", string2))
如果string1包含一个表名,在我看来,您需要在将表名传递给Sql Server之前将其放入字符串中。Sql server已告知您,在它需要表变量的地方,它被赋予了一个字符串。它指的是您在查询的FROM子句中输入的@LRU。
QueryContext
一点也不复杂。它只需要一个额外的参数,使用context.TODO()
@MWillemse可以有效地忽略它-请参阅@Flimzy-heh上的贫乏文档-我认为TODO行是Go docs中的一个输入错误;-)。使用QueryContext进行了尝试,错误仍然与上面发布的相同。如果将查询更改为var checkQuery=“DECLARE@LRU VARCHAR(255),@ENVVAR VARCHAR(255);从@LRU中选择SigCode,其中LRUEmu=@ENVVAR;”
,我始终使用变量作为表名。请参阅上面的编辑,了解使用pymssql的生产代码中的python示例。此外,我尝试了上面最后一个代码建议,“+”符号会生成运行时错误,如果没有它们,我会得到通常的LRU未定义错误。加号错误可能是驱动程序问题,我以前在SQLS Mgmt Studio中使用过该语法…该变量在发送到sql server之前由phython代码解析。关于+号,我假设您知道如何将3个字符串连接在一起,我(再次)假设您理解这行代码的目的。无论如何,请重新阅读我的awnser,试着理解我所说的,当你执行这两行代码时会发生什么。如果可能的话,启动调试会话并进入db.Query方法,在将查询发送到SQL Server之前查看它对您的查询所做的操作。我可以使用加号来完成此操作,但没有真正的方法让db驱动程序以这种方式清理输入。通过使用参数插入,编译器和db驱动程序都可以帮助清理输入。3年前(和2种语言)我就不再以这种方式组装SQL字符串了。简单的蛮力字符串组装不是imo的发展方向。如果您看看python/perl/go中其他RDMBS驱动程序的发展方向,参数化插入就是发展方向。是的,我错过了加号。抱歉,咖啡前。再说一次,这一切就像python中的符咒一样。我现在将坚持p3,看看我是否能以某种方式帮助go司机。具有讽刺意味的是,我正试图用这个小项目来将golang引入我们的开发组织。。。