[英]SQLCMD only returns one row
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
在 Windows 上使用 SQL 服务器的 SQLCMD 版本 14.0.3456.2 NT。
我运行这个命令:
sqlcmd -i D:\DATA\INT\BATCH\ENV_CHECK.SQL
最后,我想运行这个命令:
D:\DATA\INT\BATCH\ENV_CHECK.SQL -o D:\DATA\INT\LOGS\ENV_DB.SQL -h -1
但首先是第一件事。
这是一个直接的SELECT
查询。 没有循环。 当我在 SSMS 中运行查询时,直接从源文件加载它后,它在一秒钟内返回了 333 条记录。
(受影响的 333 行)
完成时间:2023-02-02T17:49:57.1346709-05:00
当我使用SQLCMD
运行它时,如下所示:
SET @CMD = 'sqlcmd ' + '-i ' + @BAT + ' -o ' + @FIL + ' -h -1'
PRINT 'CMD IS: ' + @CMD
EXEC @RTN_COD = master.dbo.xp_cmdshell @CMD
我收到这条消息:
CMD IS: sqlcmd -i D:\DATA\INT\BATCH\ENV_CHECK.SQL
它只返回一行。 它总是返回同一行。 我已经尝试对 output 进行排序以查看它是否会返回不同的行,但它不会。 我也试过返回更多行。 始终显示完全相同的行,从包中间的某个地方开始。
无论我在屏幕上显示还是写入文件,都会发生同样的事情。 同一行。
我不知道从这里到 go 哪里。
编辑:回应以下评论
-- creates insert statements for db objects
-- fingerprint function creates a unique value based on code text
-- that allows comparison of versions in different environments
select 'INSERT INTO STG.DBO.XX_ENV_STATUS VALUES ('
+ CHAR(39)
+ ENV
+ CHAR(39)+', '+CHAR(39)
+ TYPE
+ CHAR(39)+', '+CHAR(39)
+ OBJ_NAME
+ CHAR(39)+', '+CHAR(39)
+ CAST(CALC AS VARCHAR(10))
+ CHAR(39) +');'
FROM
(select distinct 'TEST' ENV, A.TYPE TYPE, substring(a.name, 1, 50) OBJ_NAME,
stg.dbo.XX_SP_FINGERPRINT(a.name) + stg.dbo.XX_VW_FINGERPRINT(a.name) + stg.dbo.XX_FN_FINGERPRINT(a.name) CALC
from sysobjects a --,
-- syscomments b
where
a.type IN ('P', 'V', 'FN')
--'P' -- only stored procedures
--'V' -- only views
-- 'FN' -- only functions
-- and a.id = b.id
and left(a.name, 3) = 'XX_'
AND LEFT(A.NAME,6)<> 'XX_R22'
-- and a.name like '%XX_%'
-- and b.text like ('%XX_%')
--ORDER BY A.TYPE,substring(a.name, 1, 50)
) X
order by type, calc
样品 OUTPUT
插入 STG.DBO.XX_ENV_STATUS 值(“测试”、“FN”、“XX_VW_FINGERPRINT”、“13736”);
插入 STG.DBO.XX_ENV_STATUS VALUES ('TEST', 'FN', 'XX_SP_FINGERPRINT', '14187');
插入 STG.DBO.XX_ENV_STATUS VALUES ('TEST', 'FN', 'XX_FN_FINGERPRINT', '14208');
简短的故事是我有两个版本。 短的一个,显示在屏幕上,所需的一个输出到一个文件,该文件将被加载到数据库中。 今天上午,我在删除后添加了 5 秒延迟,以防这是问题所在,但事实并非如此。
-- eventually, this will be a sql server job
DECLARE @RTN_COD INT,
@BAT VARCHAR(300),
@FIL VARCHAR(300),
@CMD VARCHAR(300)
-- SET VARS
SET @BAT = 'D:\DATA\INT\BATCH\ENV_CHECK.SQL'
SET @FIL = 'D:\DATA\INT\LOGS\ENV_DB.SQL'
-- DEL PRIOR OUTPUT
SET @CMD = 'del /F /Q ' + @FIL
PRINT 'DELETE CMD IS: ' + @CMD
EXEC @RTN_COD = master.dbo.xp_cmdshell @CMD
-- GIVE DELETE SOME TIME
WAITFOR DELAY '00:00:05';
-- CREATE INSERT STATEMENTS
-- desired
SET @CMD = 'sqlcmd ' + '-i ' + @BAT + ' -o ' + @FIL + ' -h -1'
-- display
--SET @CMD = 'sqlcmd ' + '-i ' + @BAT -- + '" -h -1'
PRINT 'CMD IS: ' + @CMD
EXEC @RTN_COD = master.dbo.xp_cmdshell @CMD
select top 30 * from sysobjects
什么?我在我的文件底部添加了 sql,评论了另一个 SQL。
有趣的是,使用SET @CMD = 'sqlcmd ' + '-i ' + @BAT -- + '" -h -1'
我显示了所有 30 条记录,但我得到的是 header(列 + 下划线)。
使用SET @CMD = 'sqlcmd ' + '-i ' + @BAT + ' -o ' + @FIL + ' -h -1'
我得到相同的 30,除了在文件中并且没有标题,这正是我想从我的查询。
当我撤销评论并执行我的评论时,我又回到了 1 条记录。 唯一的区别似乎是简单性之一。 一时兴起,我把指纹线改了,变成了static号。 同样的结果,1 行。 去掉所有注释行,结果相同,1 行。 而且,每次都是同一条线。 output无变化。
我尝试使用子查询select name, status, crdate, sysstat from (select top 30 * from sysobjects)T
将简单查询变成一个查询,结果相同,30 行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.