bcp导出表头,只知道一个表名,用批处理文件实现还有shell脚本

舒夫 2018-12-11 10:22:15
bcp导出表头,只知道一个表名,需要先通过表名获取表头,再导出,用.bat文件,shell实现,应该怎么写
...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
舒夫 2018-12-11
  • 打赏
  • 举报
回复
引用 8 楼 舒夫 的回复:
[quote=引用 6 楼 吉普赛的歌 的回复:]
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT IDENTITY(1,1) PRIMARY KEY,
n NVARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES ('a'),('bc'),('小明')

GO
IF OBJECT_ID('dbo.Proc_QueryWithHeader') IS NOT NULL
DROP PROC dbo.Proc_QueryWithHeader
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE dbo.Proc_QueryWithHeader
@tableName NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT '+STUFF(
(
select ',CAST('''+c.name+''' AS nvarchar(max)) as ['+c.name+']' from
sys.columns AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
FOR XML PATH('')
),1,1,'')
SET @sql= @sql+ 'union all SELECT ' + STUFF(
(
SELECT ',CAST(['+c.name+'] as nvarchar(max)) AS ['+c.name+']'
FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
FOR XML PATH('')),1,1,''
)
+' FROM ['+@tableName+']'
PRINT @sql
EXEC (@sql)
END
GO
EXEC Proc_QueryWithHeader 't'
/*
SELECT CAST('id' AS NVARCHAR(MAX)) AS [id],
CAST('n' AS NVARCHAR(MAX)) AS [n]
UNION ALL
SELECT CAST([id] AS NVARCHAR(MAX)) AS [id],
CAST([n] AS NVARCHAR(MAX)) AS [n]
FROM [t]
*/
/*
id n
----------
id n
1 a
2 bc
3 小明
*/


这个存储过程, 可以得到第一行包含表头的查询结果, 你试下吧。

首先,十分感谢。我要如何用bcp调用这个存储过程[/quote]
bcp "exec tempdb.dbo.Proc_QueryWithHeader" queryout "D:\1.csv"
我这样写报错 需要参数@tablename
舒夫 2018-12-11
  • 打赏
  • 举报
回复
引用 6 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT IDENTITY(1,1) PRIMARY KEY,
n NVARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES ('a'),('bc'),('小明')

GO
IF OBJECT_ID('dbo.Proc_QueryWithHeader') IS NOT NULL
DROP PROC dbo.Proc_QueryWithHeader
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE dbo.Proc_QueryWithHeader
@tableName NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT '+STUFF(
(
select ',CAST('''+c.name+''' AS nvarchar(max)) as ['+c.name+']' from
sys.columns AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
FOR XML PATH('')
),1,1,'')
SET @sql= @sql+ 'union all SELECT ' + STUFF(
(
SELECT ',CAST(['+c.name+'] as nvarchar(max)) AS ['+c.name+']'
FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
FOR XML PATH('')),1,1,''
)
+' FROM ['+@tableName+']'
PRINT @sql
EXEC (@sql)
END
GO
EXEC Proc_QueryWithHeader 't'
/*
SELECT CAST('id' AS NVARCHAR(MAX)) AS [id],
CAST('n' AS NVARCHAR(MAX)) AS [n]
UNION ALL
SELECT CAST([id] AS NVARCHAR(MAX)) AS [id],
CAST([n] AS NVARCHAR(MAX)) AS [n]
FROM [t]
*/
/*
id n
----------
id n
1 a
2 bc
3 小明
*/


这个存储过程, 可以得到第一行包含表头的查询结果, 你试下吧。

首先,十分感谢。我要如何用bcp调用这个存储过程
舒夫 2018-12-11
  • 打赏
  • 举报
回复
引用 5 楼 二月十六 的回复:
导出表头,比较难受啊……
把上边那个字段名称横过来,一个一个的,然后union数据表字段,还得注意字段类型转换
是动态的

吉普赛的歌 2018-12-11
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1) PRIMARY KEY,
	n NVARCHAR(10)	
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES ('a'),('bc'),('小明')

GO
IF OBJECT_ID('dbo.Proc_QueryWithHeader') IS NOT NULL
	DROP PROC dbo.Proc_QueryWithHeader
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE dbo.Proc_QueryWithHeader
	@tableName NVARCHAR(50)
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @sql NVARCHAR(MAX)
	SET @sql = 'SELECT '+STUFF(
		(
			select ',CAST('''+c.name+''' AS nvarchar(max)) as ['+c.name+']' from 
			sys.columns AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
			FOR XML PATH('')
		),1,1,'')
	SET @sql= @sql+ 'union all SELECT ' + STUFF(
		(
			SELECT ',CAST(['+c.name+'] as nvarchar(max)) AS ['+c.name+']' 
			FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID(@tableName)
			FOR XML PATH('')),1,1,''
		)
	+' FROM ['+@tableName+']'
	PRINT @sql
	EXEC (@sql)
END
GO
EXEC Proc_QueryWithHeader 't'
/*
SELECT CAST('id' AS NVARCHAR(MAX))  AS [id],
       CAST('n' AS NVARCHAR(MAX))   AS [n]
UNION ALL 
SELECT CAST([id] AS NVARCHAR(MAX))  AS [id],
       CAST([n] AS NVARCHAR(MAX))   AS [n]
FROM   [t]
*/
/*
id	n
----------
id	n
1	a
2	bc
3	小明
*/
这个存储过程, 可以得到第一行包含表头的查询结果, 你试下吧。
二月十六 2018-12-11
  • 打赏
  • 举报
回复
导出表头,比较难受啊…… 把上边那个字段名称横过来,一个一个的,然后union数据表字段,还得注意字段类型转换
舒夫 2018-12-11
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
写一个 asp.net core 的控制台程序,在 Linux 中直接导出为 csv 文件就是了。
要求复杂的东西, 程序最适合。

老师的要求是用.bat .sh
select Name From syscolumns where id=OBJECT_ID('TableZp1')
可以查出列名,bcp
bcp "select * FROM test02.dbo.TableZp1" queryout "D:\1.csv" -c -t, -S "xxxx" -U xx -Pxxx
可以导出无表头数据,我想把他们合起来,写到一个.bat文件中或.sh文件中
吉普赛的歌 2018-12-11
  • 打赏
  • 举报
回复
写一个 asp.net core 的控制台程序,在 Linux 中直接导出为 csv 文件就是了。 要求复杂的东西, 程序最适合。
舒夫 2018-12-11
  • 打赏
  • 举报
回复
引用 1 楼 卖水果的net 的回复:
先查 syscolumns 表,这里面有表的列信息。

这个我知道,但是不知道怎么写出批处理语句和shell语句
卖水果的net 2018-12-11
  • 打赏
  • 举报
回复
先查 syscolumns 表,这里面有表的列信息。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧