我想将所有表bcp到数据库中的文件:
SELECT 'EXEC xp_cmdshell ''bcp ' --bcp
+ QUOTENAME(DB_NAME())+ '.' --database name
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.' -- schema
+ QUOTENAME(name) -- table
+ ' out c:\temp\' -- output directory
+ REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+ REPLACE(name,' ','') -- file name
+ '.txt -T -c''' -- extension, security
FROM sys.tables
它会生成如下语句:
EXEC xp_cmdshell 'bcp [AdventureWorks2012].[Production].[ScrapReason] out c:\temp\Production_ScrapReason.txt -T -c'
EXEC xp_cmdshell 'bcp [AdventureWorks2012].[HumanResources].[Shift] out c:\temp\HumanResources_Shift.txt -T -c'
所以我想要的是迭代上面的语句并执行它们。怎么做?
答案 0 :(得分:4)
请注意,这假设所有命令都是唯一的。
DECLARE @Commands TABLE(CommandText NVARCHAR(4000));
DECLARE @SQL NVARCHAR(4000);
INSERT INTO @Commands
SELECT 'EXEC xp_cmdshell ''bcp ' --bcp
+ QUOTENAME(DB_NAME())+ '.' --database name
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.' -- schema
+ QUOTENAME(name) -- table
+ ' out c:\temp\' -- output directory
+ REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+ REPLACE(name,' ','') -- file name
+ '.txt -T -c''' -- extension, security
FROM sys.tables
WHILE (SELECT COUNT(*) FROM @Commands) > 0
BEGIN --Command Processing
SET @SQL = (SELECT TOP 1 CommandText FROM @Commands)
--PRINT (@SQL)
EXEC (@SQL)
DELETE FROM @Commands WHERE CommandText = @SQL
END
答案 1 :(得分:0)
默认设置是您不能从SQL Server执行bcp命令。此版本适用于DOS,Powershell和BAT文件。
我没有从BCP中找到可以导出这些CSV文件标题行的设置,因此请注意,这些CSV文件不包含标题。
-- Run this command to the database you wish to export
DECLARE @Commands TABLE(CommandText NVARCHAR(4000));
DECLARE @SQL NVARCHAR(4000);
INSERT INTO @Commands
SELECT 'bcp ' --bcp
+ QUOTENAME(DB_NAME())+ '.' --database name
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+ '.' -- schema
+ QUOTENAME(name) -- table
+ ' out c:\temp\csvdump\' -- output directory
+ REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+ REPLACE(name,' ','') -- file name
+ '.csv -T -C 65001 -t "|" -k -c -S localhost' -- extension, security
FROM sys.tables
-- Copy-paste results to DOS or Powershell prompt or create a BAT file from these.
SELECT 'mkdir c:\temp\csvdump'
UNION ALL
SELECT * FROM @Commands