首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >select语句中的golang/sqlserver位置参数

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

Stack Overflow用户
提问于 2017-08-02 02:27:39
回答 1查看 1.4K关注 0票数 1

有没有人可以提供一个使用golang sqlserver驱动程序的查询或QueryRow (而不是QueryContext)的工作示例,其中包含一个简单的select和2个(或更多)位置参数?

显然,这里有一些变化:https://github.com/denisenkom/go-mssqldb/issues/260

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

使用:

代码语言:javascript
运行
复制
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),它使用一个变量来指定目标表:

代码语言:javascript
运行
复制
slice_cursor.execute(
    "select distinct Subsystem, Field from [%(dlog)s] "
    "where Subsystem not like 'STRING1' "
    "order by Subsystem, Field"
    % {
        'dlog' : datelog
    }
)

我一直在这么做。在golang/pg中,它的效果也很不错。

@putu:我试过你的建议,但没有什么乐趣。然而,新的错误...

代码语言:javascript
运行
复制
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.

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 06:58:22

我不知道golang,但我知道sql server。

代码语言:javascript
运行
复制
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代码可能如下所示:

代码语言:javascript
运行
复制
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将引发错误

代码语言:javascript
运行
复制
Must declare the table variable "@LRU"

它被你的QueryContext捕获并重新抛出。

SQL server引发此错误的原因是查询中存在语法错误。SQL server不允许( afaik和其他rdbms也不允许)允许您将表名放入变量中并对其运行select。

所以你要么这么做:

代码语言:javascript
运行
复制
var checkQuery = "select SigCode from " + string1 + " where LRUEmu=@ENVVAR"
rows, err := db.Query(checkQuery, sql.Named("ENVVAR", string2))

或者像这样使用动态sql:

代码语言:javascript
运行
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45445205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档