2016-01-28 20 views
0

我的需求是比较两个环境中的数据,并且我在两个环境的两个表中都存在diff,将该数据插入临时表并显示它。上述解决方案不适合我的场景。我会以更好的方式解释我的情况。获取column_Name如果我知道sql server中的列值

在一个Curor Cur1中,我从一个Table(Report)中获取DEV的所有数据,其中Rep_ID = 1,从REPORT表的TEST中获取对应的数据,其中Rep_ID = 1在while循环中,我将DEV和TEST

if (@DevData1 <> @TestData1) 
    BEGIN Get ColumnName from Report table where @DevData1 =1 Insert Into #TempTable (ColumnName, DevData1, TestData1) 
ENDS Cur1 Ends 

当我试图得到一个VARCHAR列的列名,我正确地与下面的查询

Declare @ColStrRep nvarchar(1000)= 'select @retValOut= Col.value(''local-name(.)'', ''varchar(max)'') from (select * from Rep_attr where Rep_Name = '''[email protected] +''' for xml path(''''), type) as T(XMLCol) cross apply T.XMLCol.nodes(''*'') as n(Col) where Col.value(''.'', ''varchar(100)'') = '[email protected] +'' 

print @ColStrRep 

EXEC Sp_executesql @ColStrRep,N'@retValOut nvarchar(100) out',@Column_Name OUT 

获得列名但是,当我试图让COLUMNNAME为整数列,当我们在表中具有与1相同的值时也是如此(例如RepI D = 1,Flag = 1,IsEmpty = 1等),查询变得困惑,而不是Rep_ID,它将检索列IsEmpty。所以我需要另一个查询,只是给了我一个columnValue的列名。

感谢和问候, Sajitha

+0

这是一个很好的开始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

“这个查询不起作用”是什么意思?请发布你的尝试和你得到的错误信息。 –

回答

0

感谢您的建议。

但我可以用下面的查询来管理情况。 如果列值是一个varchar,那么下面的查询会给我列名。

Declare @ColStrDesc nvarchar(1000)= 'select 
        @retValOut= Col.value(''local-name(.)'', ''varchar(max)'') 
        from (select * 
          from Rep_attr 
          where Rep_Name = '''[email protected] +''' 
          for xml path(''''), type) as T(XMLCol) 
         cross apply 
         T.XMLCol.nodes(''*'') as n(Col) 
        where Col.value(''.'', ''varchar(100)'') = '''[email protected]_Desc +'''' 
        print @ColStrDesc 
        EXEC Sp_executesql @ColStrDesc,N'@retValOut nvarchar(100) out',@Column_Name OUT 

如果列的值是一个整数,那么下面的查询给出列名。

Declare @ColErr nvarchar(1000)= 'SELECT @retValOut= STUFF('''' 
    + CASE WHEN EXISTS (SELECT 1 FROM [dbo].[Rep_attr] WHERE Cast([Rep_Errs] as VARCHAR(64)) = '[email protected]_Errs+') THEN '' Rep_Errs'' ELSE '''' END , 1, 1, '''')' 

        EXEC Sp_executesql @ColErr,N'@retValOut nvarchar(100) out',@Column_Name OUT 
0

该解决方案将搜索使用LIKE操作为varchar列(即列LIKE '%5%')和对于int列的严格值(即列= 5)

DECLARE @table_name SYSNAME = 'your_table', 
     @search_string VARCHAR(100) = '5', --what to search 
     @column_name SYSNAME, 
     @type_name SYSNAME, 
     @sql_string  VARCHAR(2000) 


BEGIN TRY 
    DECLARE columns_cur CURSOR 
     FOR 
      SELECT columns.name, types.name type_name FROM sys.columns 
       JOIN sys.types ON columns.system_type_id = types.system_type_id 
       JOIN sys.objects ON columns.object_id=objects.object_id 
       WHERE objects.type = 'U' AND [email protected]_name 
       AND types.name IN ('varchar', 'nvarchar', 'int', 'bigint', 'smallint') --types of columns which you want to use for search 

    OPEN columns_cur 

    FETCH NEXT FROM columns_cur INTO @column_name, @type_name 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     IF @type_name IN ('varchar', 'nvarchar') 
      SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE [' + @column_name + '] LIKE ''%' + @search_string + '%'') RAISERROR(''' + @table_name + ', ' + @column_name + ''',0,1) WITH NOWAIT' 
     ELSE 
      SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE [' + @column_name + '] = TRY_CAST(''' + @search_string + ''' AS '+ @type_name +')) RAISERROR(''' + @table_name + ', ' + @column_name + ''',0,1) WITH NOWAIT' 
     EXECUTE(@sql_string) 

     FETCH NEXT FROM columns_cur INTO @column_name, @type_name 
    END 

    CLOSE columns_cur 
    DEALLOCATE columns_cur 
END TRY 
BEGIN CATCH 
    CLOSE columns_cur 
    DEALLOCATE columns_cur 
    RAISERROR(' - No access to table %s',0,1,@table_name) WITH NOWAIT 
END CATCH 
+0

嗨德米特里波利亚科夫, – sajitha

相关问题