Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除未使用的(生成的)列_Sql Server_Dynamic_Cursor - Fatal编程技术网

Sql server 删除未使用的(生成的)列

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 | | |

我正在尝试拆分名称值,以便在以后进行分析。为此,我在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    |     |     |     |     |     |     |      |      |      |      |      |     
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