0

我正在尝试在 sql server 查询 where 子句中使用 sqsh 变量,但无法使其工作。以下是我面临的问题的简单模拟。有人可以帮我解决这个问题吗

这按预期工作

select  * from information_schema.tables where table_name = 'PHONES';

但以下将不起作用

\set tableName=PHONES;

select * from information_schema.tables where table_name = $tableName;
     Error Message:: Invalid column name 'PHONES'

select * from information_schema.tables where table_name = '$tableName';
     No rows are returned as it searches for a table $tableName

select * from information_schema.tables where table_name = "$tableName";
     Error Message:: Invalid column name 'PHONES'.
4

1 回答 1

0

要解释这里发生了什么,您应该查看在变量扩展后发送到服务器的 SQL 缓冲区。为了做到这一点,你应该跳过';' 快捷方式并在下一行提供 '\go -e' (不带引号)。请注意,如果发生错误,这可能不会显示 SQL 缓冲区。

第一行将扩展为:

select * from information_schema.tables where table_name = PHONES

这里 PHONES 被解释为表中的列名,但是由于该列名不存在,SQL Server 会以错误消息进行响应。

第二行将扩展为:

select * from information_schema.tables where table_name = '$tableName'

由于单引号,变量没有被sqsh扩展并按原样发送到服务器,因此结果集为空。

第三行将扩展为:

select * from information_schema.tables where table_name = "PHONES"

这看起来更像是一个字符串搜索参数,但由于 QUOTED_IDENTIFIER 选项可能在默认情况下处于打开状态,SQL 服务器仍在寻找名为 PHONES 的列。

为了解决这个问题,您应该提供单引号,但仍希望 sqsh 扩展变量。您可以通过转义单引号来做到这一点,例如:

select * from information_schema.tables where table_name = \\'$tableName\\';

希望这可以帮助。

于 2017-10-22T14:32:23.030 回答