我试图在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'.
答案 0 :(得分:0)
为了解释这里发生的事情,你应该看一下在变量扩展后发送到服务器的SQL缓冲区。为了做到这一点,你应该跳过&#39 ;;'快捷方式并提供' \ 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 Server仍在查找名为PHONES的列。
为了解决这个问题,您应该提供单引号,但仍希望sqsh扩展变量。您可以通过转义单引号来完成此操作,如:
select * from information_schema.tables where table_name = \\'$tableName\\';
希望这有帮助。