如何从Linux访问SQL Server表及解决查询结果存储报错问题
在Linux终端访问SQL Server表并将COUNT(*)结果存入变量的解决方案
先给你揪出核心问题:你用的sqlplus是Oracle数据库的专属命令行工具,SQL Server完全不兼容它!这就是你碰到sqlplus command not found的根源——装错工具了。SQL Server在Linux下有官方的命令行工具sqlcmd,咱们一步步来解决你的需求:
第一步:安装SQL Server命令行工具(sqlcmd)
不同Linux发行版的安装步骤略有不同,给你列几个主流的:
Ubuntu/Debian
# 添加微软官方软件源 curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list # 更新源并安装sqlcmd和依赖 sudo apt update sudo apt install -y mssql-tools unixodbc-dev
安装完成后,记得把工具路径加入环境变量(这样就能直接在终端调用sqlcmd了):
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc
RHEL/CentOS/Fedora
# 添加微软官方软件源 sudo curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/msprod.repo # 安装sqlcmd和依赖 sudo yum install -y mssql-tools unixODBC-devel
同样要添加环境变量:
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc
第二步:用sqlcmd查询COUNT(*)并存储到变量
现在可以用sqlcmd来实现你的需求了,顺便解决你之前碰到的Bad Substitution错误(这个错误大多是因为用了dash而非bash,或者here-doc的写法不符合shell规范)。
正确的脚本写法
把你的用户名、密码、数据库名、表名替换成实际值,脚本如下:
# 定义变量(替换成你的实际信息) username="your_sql_username" password="your_sql_password" database_name="your_db_name" tablename="your_table_name" # 执行查询并将结果存入count变量 count=$(sqlcmd -S localhost -U $username -P $password -d $database_name -h -1 -Q "SELECT COUNT(*) FROM $tablename") # 输出结果 echo "表${tablename}的记录数:${count}"
参数详解:
-S:指定SQL Server实例地址,本地用localhost,远程可以写IP地址,端口号(默认端口1433)-U:SQL Server登录用户名-P:SQL Server登录密码(如果用Windows认证,Linux下可以用-E,但一般用SQL认证)-d:指定要连接的目标数据库-h -1:去掉查询结果的表头和分隔线,只返回纯数字的COUNT值,方便存入变量-Q:执行指定的SQL语句后直接退出,适合脚本调用
避免Bad Substitution的小技巧:
- 确保用bash运行脚本,有些系统默认
sh是dash,直接用bash your_script.sh启动 - 用
$()来捕获命令输出,比反引号(`)更清晰,嵌套时也不容易出语法问题 - 如果密码/数据库名包含特殊字符,记得用双引号包裹变量值,比如
password="P@ssw0rd!"
第三步:安全提醒(非常重要)
直接在脚本或命令行里明文写密码风险很高,推荐两种安全的替代方式:
- 用环境变量传递密码:
export SQLCMDPASSWORD="your_password" count=$(sqlcmd -S localhost -U $username -d $database_name -h -1 -Q "SELECT COUNT(*) FROM $tablename")
- 交互式输入密码(适合手动操作):
sqlcmd -S localhost -U $username -d $database_name -h -1 -Q "SELECT COUNT(*) FROM $tablename"
运行后会提示你输入密码,不会在命令行历史或脚本里留下明文。
内容的提问来源于stack exchange,提问作者Aakib




