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

时间:2017-08-01 18:27:39

标签: sql-server go

任何人都可以使用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.

1 个答案:

答案 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))