繁体   English   中英

SQLCMD 只返回一行

[英]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 哪里。

编辑:回应以下评论

  1. 分享 env_check.sql
   -- 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');

  1. SET 命令与执行命令的差异

简短的故事是我有两个版本。 短的一个,显示在屏幕上,所需的一个输出到一个文件,该文件将被加载到数据库中。 今天上午,我在删除后添加了 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
  1. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM