我需要我的选择有这样的模式:
SELECT '<text> ' + tbl.* + ' </text>' FROM table tbl;
理想的解决方案是将所有列用逗号分隔,以便输出:
表1的SQL结果有两列:
'<text>col1, col2</text>'
表2的SQL结果包含三列:
'<text>col1, col2, col3</text>'
我尝试使用CONCAT(...)
这样的功能:
SELECT CONCAT('<text>', tbl.*, '</text>')
FROM table2 tbl
但我明白这并不是那么简单,因为列数可变。
有没有解决这个问题的简单解决方案?
我使用的是SQL Server 2008 R2。
答案 0 :(得分:10)
给定表名的任意数量的列;
如果您需要包含<text>
DECLARE @s VARCHAR(500)
SELECT @s = ISNULL(@s+', ','') + c.name
FROM sys.all_columns c join sys.tables t
ON c.object_id = t.object_id
WHERE t.name = 'YourTableName'
SELECT '<text>' + @s + '</text>'
-- RESULTS
<text>col1, col2, col3,...</text>
如果您需要使用<text>
选择查询结果集包装,那么
SELECT @S = ISNULL( @S+ ')' +'+'',''+ ','') + 'convert(varchar(50), ' + c.name FROM
sys.all_columns c join sys.tables t
ON c.object_id = t.object_id
WHERE t.name = 'YourTableName'
EXEC( 'SELECT ''<text>''+' + @s + ')+' + '''</text>'' FROM YourTableName')
--RESULTS
<text>c1r1,c2r1,c3r1,...</text>
<text>c1r2,c2r2,c3r2,...</text>
<text>c1r3,c2r3,c3r3,...</text>
答案 1 :(得分:3)
MS SQL Server 2008架构设置:
create table YourTable
(
ID int identity primary key,
Name varchar(50),
)
insert into YourTable values
('Name 1'),
('Name 2'),
('Name 3'),
('Name 4'),
('Name 5')
查询1 :
select (
select (
select ', '+T2.N.value('./text()[1]', 'varchar(max)')
from (
select T.*
for xml path(''), type
) as T1(N)
cross apply T1.N.nodes('/*') as T2(N)
for xml path(''), type
).value('substring(./text()[1], 3)', 'varchar(max)')
for xml path('text'), type
)
from YourTable as T
<强> Results 强>:
| COLUMN_0 |
--------------------------
| <text>1, Name 1</text> |
| <text>2, Name 2</text> |
| <text>3, Name 3</text> |
| <text>4, Name 4</text> |
| <text>5, Name 5</text> |
答案 2 :(得分:1)
我尝试了更多通用方法
Create Procedure P_GetConcatColumns(@tablename varchar(200),@Seperator Varchar(20),@StartTag Varchar(20),@EndTag Varchar(20),@WhereString Varchar(400),@OrderString Varchar(400)) as
DECLARE @TmpTableName VARCHAR(100),
@Columns NVARCHAR(4000),
@SQL NVARCHAR(MAX),
@GENNAME VARCHAR(100)
Select @GENNAME='##'+Replace(Cast(NewID() as Varchar(40)),'-','')
IF OBJECT_ID('tempdb.dbo.' + @GENNAME) IS NOT NULL
BEGIN
EXEC('DROP TABLE ' +@GENNAME);
END
Select @SQL='SELECT TOP 1 * INTO '+@GENNAME+' FROM ' + @tablename
Exec (@SQL)
SET @TmpTableName = 'tempdb.dbo.' + @GENNAME
SELECT @Columns =
STUFF(
(
SELECT '+' + @Seperator + '+CAST(Coalesce(' + c.name + ','''') AS VARCHAR(MAX))' + CHAR(13)
FROM tempdb.sys.columns c
WHERE c.[object_id] = object_Id(@TmpTableName)
FOR XML PATH(''),TYPE
).value('.','VARCHAR(MAX)')
,1,len(@Seperator)+2,'')
--SET @SQL = N'SELECT ' +''''+ @StartTag +''''+'+'+ @Columns +''''+'+'+ @EndTag + ''' FROM ' + @tablename
SET @SQL = N'SELECT ''' +@StartTag+ '''+'+ @Columns +'+'''+ @EndTag + ''' FROM ' + @tablename
+' '+Coalesce(@WhereString,'')
+' '+Coalesce(@OrderString,'')
Print @SQL
EXEC sp_executeSQL @SQL
--ExampleCall P_GetConcatColumns 'Arten',''',''','<test>','</test>','where id>1','Order by ID desc'
答案 3 :(得分:0)
尝试以下代码:
element.addEventListener('keyup', myEfficientFn);
element.addEventListener('keydown', myEfficientFn);
element.addEventListener('change', myEfficientFn);
// etc...
答案 4 :(得分:-1)
IBMDB2:使用所需的分隔符创建文件,例如下面的delimiter ='#|#'
Step1 :-运行以下查询,然后在query_to_execute列中获得SQL语句:
select table_name, 'select '||listagg(column_name, '||''#|#''||')||' from '||trim(table_schema)||'.'||(table_name) as query_to_execute
from qsys2.SYSCOLUMNS
where table_name in ('YOURTABLE1', 'YOURTABLE2')
and table_schema = 'YOURSCHEMA'
group by table_schema, table_name
第二步:-运行上面形成的查询以获取带分隔符的SQL文件。
Step3a (如果从本机iSeries运行SQL):将结果移动到平面文件,然后导入/ FTP_获取平面文件到其他平台。
Step3b (如果从Windows使用查询工具运行SQL):将结果导出到您选择的file_name.xxx。
通过这种方式,我们将创建一个CSV或带分隔符的分隔文件。
/ Neeraj Kumar