【问题标题】:How can to get distinct data of all the columns in a table in spearte result set in SQL如何在SQL中的单独结果集中获取表中所有列的不同数据
【发布时间】:2020-07-19 07:34:58
【问题描述】:

我创建了一个存储过程来获取所有列的不同数据。但我必须指定各个表的每个列名。

但我不想指定表的每个列名并获取单独结果集中所有列的不同数据。

+----+------+---------+-----------+
| Id | name | Address |   City    |
+----+------+---------+-----------+
|  1 | A    | Max     | Rajasthan |
|  2 | A    | Min     | Delhi     |
|  1 | A    | Max     | Rajathan  |
|  1 | A    | Min     | UP        |
+----+------+---------+-----------+

这是我的存储过程的代码,用于获取每列的不同结果集

create proc sp_task1  @table varchar(20)
as
begin
exec('
select distinct id FROM ' +@table+'
')
exec('
select distinct name FROM ' +@table+'
')
exec('
select distinct address FROM ' +@table+'
')
exec('
select distinct city FROM ' +@table+'
')
end
exec sp_task1 @table = 'table1'

这是我在执行 SP 时得到的结果。

+----+
| id |
+----+
|  1 |
|  2 |
+----+

+------+
| name |
+------+
| A    |
+------+


+---------+
| Address |
+---------+
| Max     |
| Min     |
+---------+


+-----------+
|   city    |
+-----------+
| Rajasthan |
| Delhi     |
+-----------+

现在,我想在不指定列名的情况下动态执行此操作。

请就这个问题给我任何帮助。

【问题讨论】:

    标签: sql-server tsql stored-procedures dynamic-sql


    【解决方案1】:

    您可以使用以下查询来执行此操作。

    测试设置

    CREATE TABLE Test(id int, name varchar(20), city varchar(20));
    
    INSERT INTO Test
    values(1,'abc','chennai'),
    (2,'abc','bangalore');
    
    CREATE PROCEDURE USP_GetDistinct(@TableName SYSNAME,@TableSchema SYSNAME )
    AS
    BEGIN
        DECLARE @SQL NVARCHAR(MAX)
    
        SET @SQL = (
        SELECT 'SELECT  DISTINCT ' + 
        Column_Name + 
               ' FROM ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(Table_Name) + CHAR(13)+ CHAR(10) + 'GO'+CHAR(13)+ CHAR(10)
        FROM INFORMATION_SCHEMA.COLUMNS C
        WHERE TABLE_NAME = @TableName AND table_schema = @TableSchema      
        FOR XML PATH(''), Type
        ).value('.', 'varchar(max)')
    
        --PRINT @SQL
    
        EXECUTE (@SQL)
    END
    

    执行程序

    EXEC USP_GetDistinct @TableName='Test', @TableSchema='dbo'
    

    结果集

    +----+
    | id |
    +----+
    |  1 |
    |  2 |
    +----+
    
    +------+
    | name |
    +------+
    | abc  |
    +------+
    
    
    +-----------+
    |   city    |
    +-----------+
    | bangalore |
    | chennai   |
    +-----------+
    

    【讨论】:

    • 欢迎。请将其标记为答案,以便将来对其他人有所帮助。
    • 在 Sql Server 2017 及更高版本中,您可以使用 STRING_AGG 代替 XML PATH 技术
    • @Venkataraman R,你能解释一下你在这个存储过程中做了什么吗?
    • 我正在读取 INFORMATION_SCHEMA.COLUMNS 表中的列列表,然后生成动态 SQL 语句。
    • FOR XML Path 是一种生成值连接的方法。您可以在网上找到有关此的示例。 CHAR(13)、CHAR(10) 用于回车、换行。您可以在线搜索它们。搜索引擎是您了解它们的最佳朋友。
    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2011-07-05
    • 2015-08-09
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多