Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 select语句中的golang/sqlserver位置参数_Sql Server_Go - Fatal编程技术网

Sql server select语句中的golang/sqlserver位置参数

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

任何人都可以使用golang sqlserver驱动程序提供一个简单的select和2个(或更多)位置参数的查询或QueryRow(不是QueryContext)的工作示例吗

显然,有一些搅动:

给出的唯一示例代码是QueryContext,它对于简单的cli数据转换程序来说是超复杂的。这对于postgres或mysql来说非常简单,但对于sql server,我简直是束手无策

使用:

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引入我们的开发组织。。。