【问题标题】:BCP command execute each row SQL Command in TableBCP 命令执行表中的每一行 SQL 命令
【发布时间】:2020-12-01 13:33:59
【问题描述】:

我编写了一个程序,将每个 SQL 查询数据导出到带有标题的 csv 文件。 但我不知道如下所示的错误。

消息 512,第 16 级,状态 1,第 26 行 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或使用子查询时,这是不允许的 作为表达。 消息 512,第 16 层,状态 1,第 27 行 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或使用子查询时,这是不允许的 作为表达式。

这里是我的示例数据库

这里有我的代码

DECLARE @SQLCmd varchar(max)
    DECLARE @FilePathCmd varchar(max)
    DECLARE @ExportCmd varchar(max)

    SET @SQLCmd=(SELECT CommandText from TestDB.dbo.CommandExportData)
    SET @FilePathCmd=(SELECT FilePath from TestDB.dbo.CommandExportData)

    

   SELECT @ExportCmd='bcp "'+@SQLCmd+'" queryout "'+@FilePathCmd+'" -c -t, -T -S' + @@servername
   print(@ExportCmd)
   exec master..xp_cmdshell @ExportCmd

【问题讨论】:

  • 没有看到代码,确实没有足够的信息来帮助解决这个问题。也就是说,错误似乎很明显。
  • @GordonLinoff 完成代码
  • 什么令人困惑? CommandExportData 不止一行。
  • 由于SQL只能读取第一行数据,无法继续执行第二行数据
  • 这是您需要光标的极少数情况之一,如果这种方法应该被认为是一种好的方法。就我个人而言,我更喜欢为此编写客户端代码;它可以像使用 Task Scheduler 调度的 PowerShell 脚本一样简单。

标签: sql-server tsql bcp


【解决方案1】:

这里是我创建的用于执行表中每一行 SQL 命令的 Cursor 语句

use TestDB

DECLARE @storedprocedure_name varchar(100)
DECLARE @cmd VARCHAR(4000)

DECLARE @FilePath varchar(100)
DECLARE @FileNames varchar(100)

DECLARE spCursor CURSOR FAST_FORWARD FOR 
SELECT CommandText,FilePath,FileNames FROM dbo.MultipleQuery
OPEN spCursor
FETCH NEXT FROM spCursor INTO @storedprocedure_name ,@FilePath,@FileNames
WHILE @@fetch_status = 0
BEGIN

 SET @cmd = 'bcp "' +
  @storedprocedure_name + '" queryout "' + @FilePath +@FileNames +'" -c -UTF8 -T -S'+@@SERVERNAME
PRINT @cmd


EXEC master..xp_cmdshell @cmd

 FETCH NEXT FROM spCursor INTO @storedprocedure_name,@FilePath,@FileNames
END
CLOSE spCursor
DEALLOCATE spCursor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多