嗨,我有一个 shell 脚本,可以在 SQL 服务器中插入 linux 服务器的磁盘状态。在插入 SQL 命令之前,程序会正确执行并结束。但是,当我插入 SQL 命令时,.sh 文件永远不会转到下一行执行。它始终处于循环中。请帮忙
#!/bin/bash
#Functions here
insert() {
echo "--INSERT FUNCTION--"
echo "$1"
fsname=$1
fs=$(echo "${fsname: -3}")
sqlcmd -S <ipadd> -U <user> -P <pass> -d tech_admin -Q "EXEC insertDiskStatus $fs"
sleep 1
}
echo "TEST"
cd ~/Documents
pwd
df -Ph --exclude-type=tmpfs --exclude-type=ext3 --block-size=GB | column -t | sed 1d > diskspace.log
filename=diskspace.log
while read -r line
do
this=$line
fs=$(echo $line | awk '{print $1}')
insert $fs
done < "$filename"
Run Code Online (Sandbox Code Playgroud) 我正在尝试自动化分离和删除数据库的过程(通过VBS objshell.run)如果我手动使用SSMS分离和删除我可以将数据库文件复制到另一个位置...但是,如果我使用:
sqlcmd -U sa -P MyPassword -S (local) -Q "ALTER DATABASE MyDB set single_user With rollback IMMEDIATE"
Run Code Online (Sandbox Code Playgroud)
然后
sqlcmd -U sa -P MyPassword -S (local) -Q "DROP DATABASE MyDB"
Run Code Online (Sandbox Code Playgroud)
它分离/删除然后删除文件.如何在没有删除的情况下获取分离和删除?
这是命令行:
sqlcmd -S localhost -U myuser -P mypwd -b -r0 -Q "raiserror('hello',10,1) with nowait;waitfor delay '00:00:10';raiserror('world!',10,1) with nowait"
Run Code Online (Sandbox Code Playgroud)
它应该立即输出hello,然后在 10 秒后输出world!. 不幸的是,它会在 10 秒后输出两个字符串。
sqlcmd 可以做对吗?如何?
聚苯乙烯
我不想为此使用 LinqPad 或任何 GUI。
我正在使用查询从 sql 数据库中选择数据。它有行,但数据raader.Read()函数返回false并且行为空,正如我在调试中检查的那样
我一直在使用的代码是
public void getSale()
{
DB db = new DB();
try
{
db.cmd.CommandText = "select * from Sale where date is not null and (date between '"+StartDate+"' and '"+EndDate+"') order by date";
db.cmd.Connection = db.con;
db.con.Open();
if(db.con.State == System.Data.ConnectionState.Open)
{
db.dataReader = db.cmd.ExecuteReader();
if(db.dataReader.HasRows)
{
while(db.dataReader.Read())
{
SaleModel sm = new SaleModel();
sm.SaleId = long.Parse(db.dataReader["Id"].ToString());
sm.UserName = db.dataReader["UserName"].ToString();
sm.ItemsQuantity = int.Parse(db.dataReader["ItemsQuantity"].ToString());
sm.TotalAmount = double.Parse(db.dataReader["TotalAmount"].ToString());
sm.SubTotal = double.Parse(db.dataReader["SubTotal"].ToString());
sm.Discount = double.Parse(db.dataReader["Discount"].ToString());
sm.Completed = bool.Parse(db.dataReader["Completed"].ToString()); …Run Code Online (Sandbox Code Playgroud) 我有很多 SQL 在多个存储过程中是相同的。
例如,大多数过程都声明了相同的变量,并在同一个 try catch 块中处理错误。
我想使用该:r命令,以便我可以在一个文件中编写此代码,然后将其导入每个 sp。我可以在构建前和构建后脚本中使用该命令,但无法在普通的“构建”类型数据库对象中使用它。
例子:
内的 SQL \Shared\CommonVariables:
内[p_An_Example]:
错误只是说“SQL46010:\ 附近的语法不正确。”
——
如果我将路径用引号括起来,则错误将在“开始”上替换为一个:
“SQL46010:BEGIN 附近的语法不正确。”
——
有什么我可以做的事情吗?目前[p_An_Example]具有BuildBuild Action 属性,并\Shared\CommonVariables设置为None.
(我使用的是 Visual Studio 2017,数据库项目指向 2008 数据库,安装了 SQLCMD 等)
编辑:不是重复,因为我确实打开了 SQLCMD 模式...但事实证明 SQLCMD 命令在存储过程语句中不可用
在 SQL Server 中,如果我想从命令行运行脚本,我可以这样做
/opt/mssql-tools/bin/sqlcmd -S $DB_HOST -U $DB_USER -P $DB_PASS -d $DB_NAME -i myscript.sql
Run Code Online (Sandbox Code Playgroud)
是否可以在没有脚本的情况下仅运行单个命令并获得结果?例如,如果我只是想跑
SELECT 1
Run Code Online (Sandbox Code Playgroud)
我该如何从命令行执行此操作?
有没有办法获得将通过SQLCMD执行的脚本文件,以接受在SQLCMD调用中传递的parms.
即..
SQLCMD(假设连接正常..) - V"1/25/2012"-i"ScriptFile.sql"
ScriptFile.sql的结构会是什么样的?它会以与任何其他程序相同的方式开始吗?
基本上我正在尝试使用参数作为SQL命令调用文本文件脚本.到目前为止,我还没有找到任何MSDN文章.
我正在尝试通过以下方式取消进行中的会话...
C:\>sqlcmd -E -S %COMPUTERNAME%\INSTANCE -Q "kill (SELECT session_id FROM sys
.dm_exec_sessions WHERE login_name = 'dbuser')"
Run Code Online (Sandbox Code Playgroud)
如何使其运作...
我正在尝试使用带有批处理脚本的sqlcmd删除数据库.我遇到的问题是如果myql数据库在sql中不可用,则代码不会进入错误处理程序块.
@echo off
@echo IF ELSE DEMO
sqlcmd -S <servername> -U <username> -P <password> -Q "DROP DATABASE Mytest"
IF ERRORLEVEL 1 goto err_handler
goto done
:err_handler
echo handle the error here
goto end
:done
echo script completion code here
:end
@echo %Message%
pause
Run Code Online (Sandbox Code Playgroud)
它给出了以下输出:
IF ELSE DEMO
Msg 3701, Level 11, State 1, Server HERCULES, Line 1
Cannot drop the database 'Mytest', because it does not exist or you do not have permission.
script completion code here
ECHO is off. …Run Code Online (Sandbox Code Playgroud) 我正在使用SQLCMD来获取表中的行数,但我也想知道查询是否遇到错误.
我使用的sqlcmd看起来像这样:
sqlcmd -S %server% -U %user% -P %pass% -b -Q "select count(*) from %table%"
Run Code Online (Sandbox Code Playgroud)
如果有效,它将返回:
-----------
10205
(1 rows affected)
Run Code Online (Sandbox Code Playgroud)
(注意,-------上面有一个空行,我没有指定列名.)
如果我传入一个不存在的表,我得到以下响应:
Msg 208, Level 16, State 1, Server devServer, Line 1
Invalid object name 'dbo.no_table'.
Run Code Online (Sandbox Code Playgroud)
由于我有-b标志,我可以检查ERRORLEVEL的值(在本例中为1).
要存储count变量,我一直在使用以下行:
for /F %%i in ('sqlcmd -S %server% -U %user% -P %pass% -b -Q "select count(*) from %table%" ^| findstr /r "[^(][0-9]"') do SET /a rec_count=%%i
Run Code Online (Sandbox Code Playgroud)
在for之后,%errorlevel%返回0.即使在do内,errorlevel也是0.
是否有任何简单的方法来运行sqlcmd,如果没有错误则存储计数,如果有错误则打印两行?
sqlcmd ×10
sql-server ×7
batch-file ×2
command-line ×2
sql ×2
c# ×1
database ×1
linux ×1
shell ×1
t-sql ×1