Sql server 从SQL Server中的表中获取分隔数据
我有一个名为Sql server 从SQL Server中的表中获取分隔数据,sql-server,sql-server-express,Sql Server,Sql Server Express,我有一个名为TBL_SUBACC的表,字段是:帐户、分支机构、Ftype、ArmCode、DrlsttrDate、CrlsttrDate、TelNo等 目前,我正在使用以下查询获取分隔的数据: select account +'|'+ branch +'|' + armcode as delimited_data from ReportingFramework.dbo.TBL_SUBACC 结果如下: delimited_data 111123|01|C0013
TBL_SUBACC
的表,字段是:帐户、分支机构、Ftype、ArmCode、DrlsttrDate、CrlsttrDate、TelNo
等
目前,我正在使用以下查询获取分隔的数据:
select account +'|'+ branch +'|' + armcode as delimited_data from
ReportingFramework.dbo.TBL_SUBACC
结果如下:
delimited_data
111123|01|C0013
111124|01|C0013
1234121|05|C0324
0120219|02|C0329
0212108|03|C3232
111121|01|C0013
这正是我想要的。但是,上面的查询要求手动指定所有文件名。
我希望获得所有字段的分隔数据,而不提供所有列名
如何select*
从表中获取分隔数据
declare @nsql nvarchar(max);
set @nsql = '
select ' + stuff((
select '+''|''+isnull(cast(' + quotename(name) + ' as nvarchar(max)),'''') '
from sys.columns
where object_id=object_id('YOUR_TABLE_NAME')
order by column_id
for xml path(''), type).value('/','nvarchar(max)'), 1, 5, '') + ' as delimited_data
from YOUR_TABLE_NAME';
--print @nsql;
exec (@nsql);
用目标表替换_表_名称(两次)。要正确地执行此操作,您需要满足到VARCHAR和NULLs的转换。这对于datetimes来说效果很差,对于另一个软件使用管道分隔的消费来说,它的格式非常糟糕。如果你只是停在print@nsql
上,在运行之前手动调整一下,效果会更好
用目标表替换_表_名称(两次)。要正确地执行此操作,您需要满足到VARCHAR和NULLs的转换。这对于datetimes来说效果很差,对于另一个软件使用管道分隔的消费来说,它的格式非常糟糕。如果您在运行之前停止打印@nsql并手动调整,效果会更好。试试这个-
查询:
DECLARE @table_name SYSNAME
SELECT @table_name = 'dbo.test'
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
SELECT CHAR(13) + ' + ''|'' + ' +
CASE WHEN c.is_nullable = 1
THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') '
ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))'
END
FROM sys.columns c WITH (NOWAIT)
WHERE c.[object_id] = OBJECT_ID(@table_name)
ORDER BY c.column_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + '
FROM ' + @table_name
PRINT @SQL
EXEC sys.sp_executesql @SQL
SELECT delimited_data =
CAST([WorkOutID] AS NVARCHAR(MAX))
+ '|' + CAST([DateOut] AS NVARCHAR(MAX))
+ '|' + CAST([EmployeeID] AS NVARCHAR(MAX))
+ '|' + CAST([DepartmentUID] AS NVARCHAR(MAX))
+ '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '')
+ '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '')
FROM dbo.test
输出:
DECLARE @table_name SYSNAME
SELECT @table_name = 'dbo.test'
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
SELECT CHAR(13) + ' + ''|'' + ' +
CASE WHEN c.is_nullable = 1
THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') '
ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))'
END
FROM sys.columns c WITH (NOWAIT)
WHERE c.[object_id] = OBJECT_ID(@table_name)
ORDER BY c.column_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + '
FROM ' + @table_name
PRINT @SQL
EXEC sys.sp_executesql @SQL
SELECT delimited_data =
CAST([WorkOutID] AS NVARCHAR(MAX))
+ '|' + CAST([DateOut] AS NVARCHAR(MAX))
+ '|' + CAST([EmployeeID] AS NVARCHAR(MAX))
+ '|' + CAST([DepartmentUID] AS NVARCHAR(MAX))
+ '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '')
+ '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '')
FROM dbo.test
试试这个-
查询:
DECLARE @table_name SYSNAME
SELECT @table_name = 'dbo.test'
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
SELECT CHAR(13) + ' + ''|'' + ' +
CASE WHEN c.is_nullable = 1
THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') '
ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))'
END
FROM sys.columns c WITH (NOWAIT)
WHERE c.[object_id] = OBJECT_ID(@table_name)
ORDER BY c.column_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + '
FROM ' + @table_name
PRINT @SQL
EXEC sys.sp_executesql @SQL
SELECT delimited_data =
CAST([WorkOutID] AS NVARCHAR(MAX))
+ '|' + CAST([DateOut] AS NVARCHAR(MAX))
+ '|' + CAST([EmployeeID] AS NVARCHAR(MAX))
+ '|' + CAST([DepartmentUID] AS NVARCHAR(MAX))
+ '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '')
+ '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '')
FROM dbo.test
输出:
DECLARE @table_name SYSNAME
SELECT @table_name = 'dbo.test'
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
SELECT CHAR(13) + ' + ''|'' + ' +
CASE WHEN c.is_nullable = 1
THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') '
ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))'
END
FROM sys.columns c WITH (NOWAIT)
WHERE c.[object_id] = OBJECT_ID(@table_name)
ORDER BY c.column_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + '
FROM ' + @table_name
PRINT @SQL
EXEC sys.sp_executesql @SQL
SELECT delimited_data =
CAST([WorkOutID] AS NVARCHAR(MAX))
+ '|' + CAST([DateOut] AS NVARCHAR(MAX))
+ '|' + CAST([EmployeeID] AS NVARCHAR(MAX))
+ '|' + CAST([DepartmentUID] AS NVARCHAR(MAX))
+ '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '')
+ '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '')
FROM dbo.test
只需指定列名。有什么问题吗?@JW웃 如果不指定列名,就没有其他选项了?您的请求似乎可以正常工作。为什么要改进它?@YuliaV在表中有50多列,指定所有列名是一项耗时的工作。。你在用什么软件?在SSMS中,您可以通过右键单击生成包含所有列名的SELECT请求,然后只需复制粘贴…只需指定列名。有什么问题吗?@JW웃 如果不指定列名,就没有其他选项了?您的请求似乎可以正常工作。为什么要改进它?@YuliaV在表中有50多列,指定所有列名是一项耗时的工作。。你在用什么软件?在SSMS中,您可以通过右键单击一次来生成包含所有列名的SELECT请求,然后您只需复制粘贴…它显示
命令已成功完成。
但我看不到数据。您是否真的用表名替换了“您的表名”?它显示命令已成功完成。
但我看不到数据。您是否已将“您的表名”替换为您的表名?