Sql server 如何为动态查询创建临时表,以便BCP输出

Sql server 如何为动态查询创建临时表,以便BCP输出,sql-server,sql-server-2012,bcp,Sql Server,Sql Server 2012,Bcp,我正在尝试编写一个存储过程,它执行文件夹中的所有.sql文件,然后将结果输出到CSV文件 我的代码: DECLARE @Table table( [FileName] varchar(100), depth int, isFile int ) DECLARE @Result int DECLARE @FileName VARCHAR(100) DECLARE @exportFile VARCHAR(100) DECLARE @ExportPath VARCHAR(100

我正在尝试编写一个存储过程,它执行文件夹中的所有
.sql
文件,然后将结果输出到CSV文件

我的代码:

DECLARE @Table table(
    [FileName] varchar(100),
    depth int,
    isFile int
)

DECLARE @Result int
DECLARE @FileName VARCHAR(100)
DECLARE @exportFile VARCHAR(100)
DECLARE @ExportPath VARCHAR(100)
DECLARE @SQLText VARCHAR(MAX)
DECLARE @FilePath VARCHAR(100)
DECLARE @FULLPATH VARCHAR(200)
DECLARE @BULKEXEC NVARCHAR(MAX)
DECLARE @Cmd nvarchar(1000)

SET @FilePath = 'c:\temp'
SET @ExportPath = 'c:\temp\output'

INSERT INTO @Table
EXEC master..xp_dirtree @FilePath,1,1

DELETE FROM @Table WHERE isFile=0

DECLARE FileList CURSOR STATIC FOR SELECT [FileName] FROM @Table WHERE FileName LIKE '%.sql'
OPEN FileList
FETCH FIRST FROM FileList INTO @FileName
    WHILE @@Fetch_Status = 0
        BEGIN
            SET @exportFile = REPLACE(@FileName,'.sql','.csv')
            SET @FULLPATH = @FilePath + '\' + @FileName
            SET @BULKEXEC = 'SELECT @SQLText = BulkColumn FROM OPENROWSET(BULK ''' + @FULLPATH + ''', SINGLE_BLOB) as x'  

            EXEC sp_ExecuteSQL @BULKEXEC, N'@SQLText VARCHAR(MAX) output ', @SQLText output

            EXEC (@SQLText)



            SET @Cmd = 'bcp "SELECT * FROM ##Temptable" queryout "' + @ExportPath + '\' + @exportFile + '" -c -t, -T'

            EXEC @Result = master..xp_cmdshell @cmd

            FETCH NEXT FROM FileList INTO @FileName
        END
CLOSE FileList
DEALLOCATE FileList
这将当前执行文件,但我缺少将结果上载到
##tentable
的中间位置


有人能帮忙吗?

看看下面的例子。它使用
@sqltext
中的一个查询,这是一个非常通用的查询,从
信息\u模式
模式(
)中选择信息

然后修改此查询以将结果插入全局临时表
##tt
,方法是从关键字中查找第一个
,并在适当位置将
插入到##tt
。执行修改后的查询以将查询结果插入临时表中

最后,使用带有
BCP
命令的
xp\u cmdshell
过程将结果写入文本文件


声明@i INT=1;

而@i如果其他人希望做类似的事情,我的工作代码如下:

    DECLARE @Table table(
        [FileName] varchar(100),
        depth int,
        isFile int
    )

    DECLARE @Result int
    DECLARE @FilePath VARCHAR(100)
    DECLARE @FileName VARCHAR(100)
    DECLARE @Fullpath VARCHAR(200)
    DECLARE @exportFile VARCHAR(100)
    DECLARE @ExportPath VARCHAR(100)
    DECLARE @FullExportPath AS VARCHAR(200)
    DECLARE @Cmd nvarchar(1000)


    SET @FilePath = '\\192.168.7.111\c$\temp'
    SET @ExportPath = '\\192.168.7.111\c$\temp\output'

    INSERT INTO @Table
    EXEC master..xp_dirtree @FilePath,1,1

    DELETE FROM @Table WHERE isFile=0

    DECLARE FileList CURSOR STATIC FOR SELECT [FileName] FROM @Table WHERE FileName LIKE '%.sql'
    OPEN FileList
    FETCH FIRST FROM FileList INTO @FileName
        WHILE @@Fetch_Status = 0
            BEGIN
                SET @exportFile = REPLACE(@FileName,'.sql','.csv')
                SET @FullExportPath = @ExportPath + '\' + @exportFile
                SET @Fullpath = @FilePath + '\' + @FileName
                SET @cmd = 'sqlcmd -i "' + @Fullpath + '" -o "' + @FullExportPath + '" -h-1 -s"," -W'

                EXEC @Result = master..xp_cmdshell @cmd

                FETCH NEXT FROM FileList INTO @FileName
            END
    CLOSE FileList
    DEALLOCATE FileList 

你能澄清一下你所说的“我错过了中间部分”是什么意思吗?@TT。到目前为止,我有运行查询的代码,还有一些将数据导出到csv的代码。我无法编写代码来填充##tentable,使用执行SQLText的不同结果,以便导出查询结果。或者,如果有更合适的方法将结果导出到csv文件,这可能是什么。感谢您的快速响应。我已经考虑过在查询中插入INTO命令,这将是一个很好的解决方案,因为##tentable将由查询本身创建。不幸的是,此解决方案不适用于此实例,因为某些查询非常复杂,有时有临时表和/或子查询,因此在主FROM之前有一个FROM。@Leigh在答案中添加了BCP的替代项。sqlcmd指针正是我想要的帮助。非常感谢。我试过几次投票,但都不允许,因为我没有足够高的声誉。我的声誉刚刚达到了要求的水平,现在我已经投了更高的票。
    DECLARE @Table table(
        [FileName] varchar(100),
        depth int,
        isFile int
    )

    DECLARE @Result int
    DECLARE @FilePath VARCHAR(100)
    DECLARE @FileName VARCHAR(100)
    DECLARE @Fullpath VARCHAR(200)
    DECLARE @exportFile VARCHAR(100)
    DECLARE @ExportPath VARCHAR(100)
    DECLARE @FullExportPath AS VARCHAR(200)
    DECLARE @Cmd nvarchar(1000)


    SET @FilePath = '\\192.168.7.111\c$\temp'
    SET @ExportPath = '\\192.168.7.111\c$\temp\output'

    INSERT INTO @Table
    EXEC master..xp_dirtree @FilePath,1,1

    DELETE FROM @Table WHERE isFile=0

    DECLARE FileList CURSOR STATIC FOR SELECT [FileName] FROM @Table WHERE FileName LIKE '%.sql'
    OPEN FileList
    FETCH FIRST FROM FileList INTO @FileName
        WHILE @@Fetch_Status = 0
            BEGIN
                SET @exportFile = REPLACE(@FileName,'.sql','.csv')
                SET @FullExportPath = @ExportPath + '\' + @exportFile
                SET @Fullpath = @FilePath + '\' + @FileName
                SET @cmd = 'sqlcmd -i "' + @Fullpath + '" -o "' + @FullExportPath + '" -h-1 -s"," -W'

                EXEC @Result = master..xp_cmdshell @cmd

                FETCH NEXT FROM FileList INTO @FileName
            END
    CLOSE FileList
    DEALLOCATE FileList