Sql server 删除未使用的(生成的)列
我正在尝试拆分名称值,以便在以后进行分析。为此,我在T-SQL中生成了15列,然后使用UDF将一列“value”拆分为新列,并使用空格作为分隔符。我得到了如下结果,正如预期的那样,到目前为止,一切都很好Sql server 删除未使用的(生成的)列,sql-server,dynamic,cursor,Sql Server,Dynamic,Cursor,我正在尝试拆分名称值,以便在以后进行分析。为此,我在T-SQL中生成了15列,然后使用UDF将一列“value”拆分为新列,并使用空格作为分隔符。我得到了如下结果,正如预期的那样,到目前为止,一切都很好 id|value |col_1|col_2|col_3|col_4|col_5|col_6|col_7|col_8|col_9|col_10|col_11|col_12|col_13|col_14|col_15 1 |xxx |x |x |x | | |
id|value |col_1|col_2|col_3|col_4|col_5|col_6|col_7|col_8|col_9|col_10|col_11|col_12|col_13|col_14|col_15
1 |xxx |x |x |x | | | | | | | | | | | |
2 |x |x | | | | | | | | | | | | | |
3 |xxxxxxx|x |x |x |x |x |x |x | | | | | | | |
4 |xxxx |x |x |x |x | | | | | | | | | | |
对我的解决方案很满意,我开始编写代码来真正分析各个部分。然而,我的同事提出了一个小的胡说八道,他说没有使用的栏目应该被删除。因为我受命帮助同事,而不是告诉他们他们的问题有多愚蠢,我说我会调查一下
问题是,我的自我不允许我使用15行硬编码的代码。我真的很想用一个游标来完成这项工作,这样,如果以后我需要解析更长的字符串(顺便说一句,这实际上是可以理解的),代码就会继续工作。我使用光标中的数字来创建列名。然后,我认为使用“select1from1wherelencolumn\u name”查询查看该列是否正在使用是一个好主意。但是现在我被困在创建包含已创建列名称的动态sql中。这是一个问题,因为当发现它为空时,我需要相同的列名来实际删除它
while @count < @max_nr_columns
begin
set @colname = 'part' + convert(varchar(255), (@count + 1))
declare @max_col_real nvarchar(4000)-- = N'max_col_real_is_empty'
declare @mc int = 0
exec('sp_executesql (select 1 from #1 where ' + @colname + ' is not null), N''@max_col_real nvarchar(4000) output'', @max_col_real output')
set @max_col_real = (@sql)
set @count = @count + 1
end
print @max_col_real
它抛出一个关于逗号的错误,这意味着问题存在于exec行中。有人能给我指出拆除8-15栏的正确方向吗?或者告诉我在上面的代码中我做错了什么
我使用的是SQL2014,但希望在2008年之前保持向下兼容。您可以通过透视来抑制空值。Pivot、Stuff和FOR XML应该从2008年开始提供 所以我们可以举个例子 使用动态UNPIVOT更新SQL代码
谢谢你@PlaidDK。这是以一种创造性的方式实现的,旋转数据可能就是正确的推动方式。但问题是,这仍然需要我硬编码col_1到col_9。在我当前的代码中,只创建了15列,但如果需要生成并填充1000列,我有一个变量供以后使用。我会玩,并试图使unpivot线动态,希望这将工作。你可以很容易地使你的unpivot动态。在上面的结果上做一个循环,并连接成一个字符串。@Steef我刚刚为您做了动态的。看看更新。当然,你也可以用一个表而不是我推荐的临时表来做同样的事情。就是这样,我可以用这个!非常感谢您的时间和心意@别担心。请记住将其标记为正确,以便其他人可以从中受益。谢谢
Create table #temp (id int, value nvarchar(50),col_1 nvarchar(50),col_2 nvarchar(50),col_3 nvarchar(50),col_4 nvarchar(50),col_5 nvarchar(50),col_6 nvarchar(50),col_7 nvarchar(50),col_8 nvarchar(50),col_9 nvarchar(50))
insert into #temp
values
(1 ,'xxx' ,'x','x','x',null,null,null,null,null,null),
(2 ,'x' ,'x',null,null,null,null,null,null,null,null),
(3 ,'xxxxxxx','x','x','x','x','x','x','x',null,null),
(4 ,'xxxx' ,'x','x','x','x',null,null,null,null,null)
declare @gruppe nvarchar(max)
declare @gruppeSql nvarchar(max)
declare @SQL nvarchar(max)
DECLARE myCustomers CURSOR FOR
Select [Name] from tempdb.sys.columns where object_id = object_id('tempdb..#temp')
and [name] like 'col%'
set @gruppeSql = ''
OPEN myCustomers
FETCH NEXT FROM myCustomers INTO @gruppe
IF (@@FETCH_STATUS>=0)
BEGIN
SET @gruppeSql = @gruppeSql +'[' +@gruppe+']'
FETCH NEXT FROM myCustomers INTO @gruppe
END
WHILE (@@FETCH_STATUS<>-1)
BEGIN
IF (@@FETCH_STATUS<>-2)
SET @gruppeSql = @gruppeSql + ',[' +@gruppe+']'
FETCH NEXT FROM myCustomers INTO @gruppe
END
CLOSE myCustomers
DEALLOCATE myCustomers
SET @gruppeSql = replace(@gruppesql,'''','')
print @gruppeSql
--select @gruppeSql
SET @SQL = '
SELECT distinct Pets = ''Select'' + STUFF((SELECT N'', '' + cols
FROM (select distinct cols from #temp a
UNPIVOT (Rowno for Cols in('+@gruppeSql+')) as pvy ) AS p2
FOR XML PATH(N'''')), 1, 2, N'' '')'
print @sql
exec(@sql)
drop table #temp