任何人都可以使用golang sqlserver驱动程序提供带有简单select和2(或更多)位置参数的Query或QueryRow(而不是QueryContext)的工作示例吗?
有一些流失,显然是:https://github.com/denisenkom/go-mssqldb/issues/260
给出的唯一示例代码是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() rows.Query() failed:mssql: Must declare the table variable "@LRU".
编辑。在下面的@Flimzy中,使用QueryContext重试:
rows, 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中,它就像魅力一样。
@putu:我尝试了你的建议,但没有快乐。新错误,但......
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: The variable name '@LRU' has already been declared. Variable names must be unique within a query batch or stored procedure.
答案 0 :(得分:1)
我不认识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服务器。生成的SQL代码可能如下所示:
DECLARE @LRU NVARCHAR(MAX) = '<contents of string 1>';
DECLARE @ENVAR NVARCHAR(MAX) = '<contents of string 2>';
select SigCode from @LRU where LRUEmu=@ENVVAR
执行此操作时,SQL Server将引发错误
Must declare the table variable "@LRU"
您的QueryContext捕获并重新抛出了哪些内容。
SQL Server引发错误的原因是查询中出现语法错误。 SQL服务器没有(并且afaik也没有其他rdbms)允许您将表名放在变量中并对其运行选择。
所以你要么:
var checkQuery = "select SigCode from " + string1 + " where LRUEmu=@ENVVAR"
rows, err := db.Query(checkQuery, sql.Named("ENVVAR", string2))
或使用像这样的动态SQL:
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))