Obtaining database information and values in extended properties





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







4















I need to obtain each DB (together with its information) from SQL Server and I am doing so by the below:



use master;
select *
from sys.databases
where database_id > 4
order by name


I also need to obtain a particular value from extended properties. Currently I am doing the below FOR EACH DB manually to obtain this value:



use <db_name>
select value from sys.extended_properties
where class_desc='DATABASE' and name = 'Application Name'


However, I need to get the value outputted from the last query in a column for each of the DB displayed by the first query respectively. Can this be done?










share|improve this question





























    4















    I need to obtain each DB (together with its information) from SQL Server and I am doing so by the below:



    use master;
    select *
    from sys.databases
    where database_id > 4
    order by name


    I also need to obtain a particular value from extended properties. Currently I am doing the below FOR EACH DB manually to obtain this value:



    use <db_name>
    select value from sys.extended_properties
    where class_desc='DATABASE' and name = 'Application Name'


    However, I need to get the value outputted from the last query in a column for each of the DB displayed by the first query respectively. Can this be done?










    share|improve this question

























      4












      4








      4








      I need to obtain each DB (together with its information) from SQL Server and I am doing so by the below:



      use master;
      select *
      from sys.databases
      where database_id > 4
      order by name


      I also need to obtain a particular value from extended properties. Currently I am doing the below FOR EACH DB manually to obtain this value:



      use <db_name>
      select value from sys.extended_properties
      where class_desc='DATABASE' and name = 'Application Name'


      However, I need to get the value outputted from the last query in a column for each of the DB displayed by the first query respectively. Can this be done?










      share|improve this question














      I need to obtain each DB (together with its information) from SQL Server and I am doing so by the below:



      use master;
      select *
      from sys.databases
      where database_id > 4
      order by name


      I also need to obtain a particular value from extended properties. Currently I am doing the below FOR EACH DB manually to obtain this value:



      use <db_name>
      select value from sys.extended_properties
      where class_desc='DATABASE' and name = 'Application Name'


      However, I need to get the value outputted from the last query in a column for each of the DB displayed by the first query respectively. Can this be done?







      sql-server






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Apr 2 at 12:49









      user1930901user1930901

      444




      444






















          3 Answers
          3






          active

          oldest

          votes


















          3














          You could use a cursor to loop over the databases and store the resultsets in a temporary table



          CREATE TABLE #TEMP(Databasename nvarchar(500),
          value sql_variant)

          DECLARE @sql NVARCHAR(max);
          DECLARE @dbname NVARCHAR(500);
          DECLARE c cursor LOCAL FAST_FORWARD FOR SELECT NAME
          FROM sys.databases
          WHERE database_id > 4
          ORDER BY NAME;
          OPEN c
          FETCH NEXT FROM c INTO @dbname;
          WHILE @@FETCH_STATUS = 0
          BEGIN
          SET @sql = '
          use '+QUOTENAME(@dbname)+'


          SELECT '''+QUOTENAME(@dbname)+''' as databasename,
          value
          FROM sys.extended_properties
          WHERE class_desc=''DATABASE'' and name = ''Application Name''';

          INSERT INTO #TEMP
          EXEC(@sql);

          FETCH NEXT FROM c INTO @dbname;
          END
          CLOSE c;
          DEALLOCATE c;

          SELECT * FROM #TEMP;
          DROP TABLE #TEMP;


          Testing



          USE my_test;  
          GO
          EXEC sp_addextendedproperty
          @name = N'Application Name',
          @value = 'ValueHere';


          USE Test;
          GO
          EXEC sp_addextendedproperty
          @name = N'Application Name',
          @value = 'ValueHere';


          Result



          Databasename    value
          [my_test] ValueHere
          [Test] ValueHere





          share|improve this answer































            3














            I'd use dynamic T-SQL to combine the results into a single output.



            DECLARE @cmd nvarchar(max);
            SET @cmd = N'';

            SELECT @cmd = @cmd + CASE WHEN @cmd = N'' THEN N'' ELSE N'
            UNION ALL
            ' END + 'SELECT d.name
            , AppName = (
            SELECT ep.value
            FROM ' + QUOTENAME(d.name) + N'.sys.extended_properties ep
            WHERE ep.class_desc = N''DATABASE''
            AND ep.name = N''Application Name''
            )
            , d.*
            FROM sys.databases d
            WHERE d.database_id = ' + CONVERT(nvarchar(11), d.database_id)
            FROM sys.databases d
            WHERE d.database_id > 4
            AND d.state_desc = N'ONLINE'
            AND d.user_access = 0
            ORDER BY d.name;

            SET @cmd = @cmd + N'

            IF EXISTS (
            SELECT 1
            FROM sys.databases d
            WHERE d.user_access <> 0
            )
            BEGIN
            DECLARE @msg varchar(1000);
            SET @msg = ''One or more databases are in single user mode, and cannot be accessed by this session.'';
            RAISERROR (@msg, 14, 1);
            END;
            ';

            PRINT @cmd;
            EXEC (@cmd);


            The query above creates a T-SQL SELECT statement for each online, multi-user, non-system, database on the instance, and combines them using UNION ALL. It then executes all combined statements in one execution. If any database is not in multi-user mode, an error is generated to make it obvious that one or more databases are not included in the output.






            share|improve this answer

































              2














              Complementing other answers - you can use sp_ineachdb - written by Aaron Bertrand and is part of firstResponderKit from Brent Ozar.



              DECLARE @cmd nvarchar(max) = N' 
              select db_name(), value from sys.extended_properties
              where class_desc=''DATABASE'' and name = ''Application Name'';';

              EXEC master.dbo.sp_ineachdb @command = @cmd, @user_only = 1;





              share|improve this answer
























                Your Answer








                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "182"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: false,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: null,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233746%2fobtaining-database-information-and-values-in-extended-properties%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                3














                You could use a cursor to loop over the databases and store the resultsets in a temporary table



                CREATE TABLE #TEMP(Databasename nvarchar(500),
                value sql_variant)

                DECLARE @sql NVARCHAR(max);
                DECLARE @dbname NVARCHAR(500);
                DECLARE c cursor LOCAL FAST_FORWARD FOR SELECT NAME
                FROM sys.databases
                WHERE database_id > 4
                ORDER BY NAME;
                OPEN c
                FETCH NEXT FROM c INTO @dbname;
                WHILE @@FETCH_STATUS = 0
                BEGIN
                SET @sql = '
                use '+QUOTENAME(@dbname)+'


                SELECT '''+QUOTENAME(@dbname)+''' as databasename,
                value
                FROM sys.extended_properties
                WHERE class_desc=''DATABASE'' and name = ''Application Name''';

                INSERT INTO #TEMP
                EXEC(@sql);

                FETCH NEXT FROM c INTO @dbname;
                END
                CLOSE c;
                DEALLOCATE c;

                SELECT * FROM #TEMP;
                DROP TABLE #TEMP;


                Testing



                USE my_test;  
                GO
                EXEC sp_addextendedproperty
                @name = N'Application Name',
                @value = 'ValueHere';


                USE Test;
                GO
                EXEC sp_addextendedproperty
                @name = N'Application Name',
                @value = 'ValueHere';


                Result



                Databasename    value
                [my_test] ValueHere
                [Test] ValueHere





                share|improve this answer




























                  3














                  You could use a cursor to loop over the databases and store the resultsets in a temporary table



                  CREATE TABLE #TEMP(Databasename nvarchar(500),
                  value sql_variant)

                  DECLARE @sql NVARCHAR(max);
                  DECLARE @dbname NVARCHAR(500);
                  DECLARE c cursor LOCAL FAST_FORWARD FOR SELECT NAME
                  FROM sys.databases
                  WHERE database_id > 4
                  ORDER BY NAME;
                  OPEN c
                  FETCH NEXT FROM c INTO @dbname;
                  WHILE @@FETCH_STATUS = 0
                  BEGIN
                  SET @sql = '
                  use '+QUOTENAME(@dbname)+'


                  SELECT '''+QUOTENAME(@dbname)+''' as databasename,
                  value
                  FROM sys.extended_properties
                  WHERE class_desc=''DATABASE'' and name = ''Application Name''';

                  INSERT INTO #TEMP
                  EXEC(@sql);

                  FETCH NEXT FROM c INTO @dbname;
                  END
                  CLOSE c;
                  DEALLOCATE c;

                  SELECT * FROM #TEMP;
                  DROP TABLE #TEMP;


                  Testing



                  USE my_test;  
                  GO
                  EXEC sp_addextendedproperty
                  @name = N'Application Name',
                  @value = 'ValueHere';


                  USE Test;
                  GO
                  EXEC sp_addextendedproperty
                  @name = N'Application Name',
                  @value = 'ValueHere';


                  Result



                  Databasename    value
                  [my_test] ValueHere
                  [Test] ValueHere





                  share|improve this answer


























                    3












                    3








                    3







                    You could use a cursor to loop over the databases and store the resultsets in a temporary table



                    CREATE TABLE #TEMP(Databasename nvarchar(500),
                    value sql_variant)

                    DECLARE @sql NVARCHAR(max);
                    DECLARE @dbname NVARCHAR(500);
                    DECLARE c cursor LOCAL FAST_FORWARD FOR SELECT NAME
                    FROM sys.databases
                    WHERE database_id > 4
                    ORDER BY NAME;
                    OPEN c
                    FETCH NEXT FROM c INTO @dbname;
                    WHILE @@FETCH_STATUS = 0
                    BEGIN
                    SET @sql = '
                    use '+QUOTENAME(@dbname)+'


                    SELECT '''+QUOTENAME(@dbname)+''' as databasename,
                    value
                    FROM sys.extended_properties
                    WHERE class_desc=''DATABASE'' and name = ''Application Name''';

                    INSERT INTO #TEMP
                    EXEC(@sql);

                    FETCH NEXT FROM c INTO @dbname;
                    END
                    CLOSE c;
                    DEALLOCATE c;

                    SELECT * FROM #TEMP;
                    DROP TABLE #TEMP;


                    Testing



                    USE my_test;  
                    GO
                    EXEC sp_addextendedproperty
                    @name = N'Application Name',
                    @value = 'ValueHere';


                    USE Test;
                    GO
                    EXEC sp_addextendedproperty
                    @name = N'Application Name',
                    @value = 'ValueHere';


                    Result



                    Databasename    value
                    [my_test] ValueHere
                    [Test] ValueHere





                    share|improve this answer













                    You could use a cursor to loop over the databases and store the resultsets in a temporary table



                    CREATE TABLE #TEMP(Databasename nvarchar(500),
                    value sql_variant)

                    DECLARE @sql NVARCHAR(max);
                    DECLARE @dbname NVARCHAR(500);
                    DECLARE c cursor LOCAL FAST_FORWARD FOR SELECT NAME
                    FROM sys.databases
                    WHERE database_id > 4
                    ORDER BY NAME;
                    OPEN c
                    FETCH NEXT FROM c INTO @dbname;
                    WHILE @@FETCH_STATUS = 0
                    BEGIN
                    SET @sql = '
                    use '+QUOTENAME(@dbname)+'


                    SELECT '''+QUOTENAME(@dbname)+''' as databasename,
                    value
                    FROM sys.extended_properties
                    WHERE class_desc=''DATABASE'' and name = ''Application Name''';

                    INSERT INTO #TEMP
                    EXEC(@sql);

                    FETCH NEXT FROM c INTO @dbname;
                    END
                    CLOSE c;
                    DEALLOCATE c;

                    SELECT * FROM #TEMP;
                    DROP TABLE #TEMP;


                    Testing



                    USE my_test;  
                    GO
                    EXEC sp_addextendedproperty
                    @name = N'Application Name',
                    @value = 'ValueHere';


                    USE Test;
                    GO
                    EXEC sp_addextendedproperty
                    @name = N'Application Name',
                    @value = 'ValueHere';


                    Result



                    Databasename    value
                    [my_test] ValueHere
                    [Test] ValueHere






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Apr 2 at 13:39









                    Randi VertongenRandi Vertongen

                    4,9361924




                    4,9361924

























                        3














                        I'd use dynamic T-SQL to combine the results into a single output.



                        DECLARE @cmd nvarchar(max);
                        SET @cmd = N'';

                        SELECT @cmd = @cmd + CASE WHEN @cmd = N'' THEN N'' ELSE N'
                        UNION ALL
                        ' END + 'SELECT d.name
                        , AppName = (
                        SELECT ep.value
                        FROM ' + QUOTENAME(d.name) + N'.sys.extended_properties ep
                        WHERE ep.class_desc = N''DATABASE''
                        AND ep.name = N''Application Name''
                        )
                        , d.*
                        FROM sys.databases d
                        WHERE d.database_id = ' + CONVERT(nvarchar(11), d.database_id)
                        FROM sys.databases d
                        WHERE d.database_id > 4
                        AND d.state_desc = N'ONLINE'
                        AND d.user_access = 0
                        ORDER BY d.name;

                        SET @cmd = @cmd + N'

                        IF EXISTS (
                        SELECT 1
                        FROM sys.databases d
                        WHERE d.user_access <> 0
                        )
                        BEGIN
                        DECLARE @msg varchar(1000);
                        SET @msg = ''One or more databases are in single user mode, and cannot be accessed by this session.'';
                        RAISERROR (@msg, 14, 1);
                        END;
                        ';

                        PRINT @cmd;
                        EXEC (@cmd);


                        The query above creates a T-SQL SELECT statement for each online, multi-user, non-system, database on the instance, and combines them using UNION ALL. It then executes all combined statements in one execution. If any database is not in multi-user mode, an error is generated to make it obvious that one or more databases are not included in the output.






                        share|improve this answer






























                          3














                          I'd use dynamic T-SQL to combine the results into a single output.



                          DECLARE @cmd nvarchar(max);
                          SET @cmd = N'';

                          SELECT @cmd = @cmd + CASE WHEN @cmd = N'' THEN N'' ELSE N'
                          UNION ALL
                          ' END + 'SELECT d.name
                          , AppName = (
                          SELECT ep.value
                          FROM ' + QUOTENAME(d.name) + N'.sys.extended_properties ep
                          WHERE ep.class_desc = N''DATABASE''
                          AND ep.name = N''Application Name''
                          )
                          , d.*
                          FROM sys.databases d
                          WHERE d.database_id = ' + CONVERT(nvarchar(11), d.database_id)
                          FROM sys.databases d
                          WHERE d.database_id > 4
                          AND d.state_desc = N'ONLINE'
                          AND d.user_access = 0
                          ORDER BY d.name;

                          SET @cmd = @cmd + N'

                          IF EXISTS (
                          SELECT 1
                          FROM sys.databases d
                          WHERE d.user_access <> 0
                          )
                          BEGIN
                          DECLARE @msg varchar(1000);
                          SET @msg = ''One or more databases are in single user mode, and cannot be accessed by this session.'';
                          RAISERROR (@msg, 14, 1);
                          END;
                          ';

                          PRINT @cmd;
                          EXEC (@cmd);


                          The query above creates a T-SQL SELECT statement for each online, multi-user, non-system, database on the instance, and combines them using UNION ALL. It then executes all combined statements in one execution. If any database is not in multi-user mode, an error is generated to make it obvious that one or more databases are not included in the output.






                          share|improve this answer




























                            3












                            3








                            3







                            I'd use dynamic T-SQL to combine the results into a single output.



                            DECLARE @cmd nvarchar(max);
                            SET @cmd = N'';

                            SELECT @cmd = @cmd + CASE WHEN @cmd = N'' THEN N'' ELSE N'
                            UNION ALL
                            ' END + 'SELECT d.name
                            , AppName = (
                            SELECT ep.value
                            FROM ' + QUOTENAME(d.name) + N'.sys.extended_properties ep
                            WHERE ep.class_desc = N''DATABASE''
                            AND ep.name = N''Application Name''
                            )
                            , d.*
                            FROM sys.databases d
                            WHERE d.database_id = ' + CONVERT(nvarchar(11), d.database_id)
                            FROM sys.databases d
                            WHERE d.database_id > 4
                            AND d.state_desc = N'ONLINE'
                            AND d.user_access = 0
                            ORDER BY d.name;

                            SET @cmd = @cmd + N'

                            IF EXISTS (
                            SELECT 1
                            FROM sys.databases d
                            WHERE d.user_access <> 0
                            )
                            BEGIN
                            DECLARE @msg varchar(1000);
                            SET @msg = ''One or more databases are in single user mode, and cannot be accessed by this session.'';
                            RAISERROR (@msg, 14, 1);
                            END;
                            ';

                            PRINT @cmd;
                            EXEC (@cmd);


                            The query above creates a T-SQL SELECT statement for each online, multi-user, non-system, database on the instance, and combines them using UNION ALL. It then executes all combined statements in one execution. If any database is not in multi-user mode, an error is generated to make it obvious that one or more databases are not included in the output.






                            share|improve this answer















                            I'd use dynamic T-SQL to combine the results into a single output.



                            DECLARE @cmd nvarchar(max);
                            SET @cmd = N'';

                            SELECT @cmd = @cmd + CASE WHEN @cmd = N'' THEN N'' ELSE N'
                            UNION ALL
                            ' END + 'SELECT d.name
                            , AppName = (
                            SELECT ep.value
                            FROM ' + QUOTENAME(d.name) + N'.sys.extended_properties ep
                            WHERE ep.class_desc = N''DATABASE''
                            AND ep.name = N''Application Name''
                            )
                            , d.*
                            FROM sys.databases d
                            WHERE d.database_id = ' + CONVERT(nvarchar(11), d.database_id)
                            FROM sys.databases d
                            WHERE d.database_id > 4
                            AND d.state_desc = N'ONLINE'
                            AND d.user_access = 0
                            ORDER BY d.name;

                            SET @cmd = @cmd + N'

                            IF EXISTS (
                            SELECT 1
                            FROM sys.databases d
                            WHERE d.user_access <> 0
                            )
                            BEGIN
                            DECLARE @msg varchar(1000);
                            SET @msg = ''One or more databases are in single user mode, and cannot be accessed by this session.'';
                            RAISERROR (@msg, 14, 1);
                            END;
                            ';

                            PRINT @cmd;
                            EXEC (@cmd);


                            The query above creates a T-SQL SELECT statement for each online, multi-user, non-system, database on the instance, and combines them using UNION ALL. It then executes all combined statements in one execution. If any database is not in multi-user mode, an error is generated to make it obvious that one or more databases are not included in the output.







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Apr 2 at 14:15

























                            answered Apr 2 at 13:42









                            Max VernonMax Vernon

                            52.4k13115232




                            52.4k13115232























                                2














                                Complementing other answers - you can use sp_ineachdb - written by Aaron Bertrand and is part of firstResponderKit from Brent Ozar.



                                DECLARE @cmd nvarchar(max) = N' 
                                select db_name(), value from sys.extended_properties
                                where class_desc=''DATABASE'' and name = ''Application Name'';';

                                EXEC master.dbo.sp_ineachdb @command = @cmd, @user_only = 1;





                                share|improve this answer




























                                  2














                                  Complementing other answers - you can use sp_ineachdb - written by Aaron Bertrand and is part of firstResponderKit from Brent Ozar.



                                  DECLARE @cmd nvarchar(max) = N' 
                                  select db_name(), value from sys.extended_properties
                                  where class_desc=''DATABASE'' and name = ''Application Name'';';

                                  EXEC master.dbo.sp_ineachdb @command = @cmd, @user_only = 1;





                                  share|improve this answer


























                                    2












                                    2








                                    2







                                    Complementing other answers - you can use sp_ineachdb - written by Aaron Bertrand and is part of firstResponderKit from Brent Ozar.



                                    DECLARE @cmd nvarchar(max) = N' 
                                    select db_name(), value from sys.extended_properties
                                    where class_desc=''DATABASE'' and name = ''Application Name'';';

                                    EXEC master.dbo.sp_ineachdb @command = @cmd, @user_only = 1;





                                    share|improve this answer













                                    Complementing other answers - you can use sp_ineachdb - written by Aaron Bertrand and is part of firstResponderKit from Brent Ozar.



                                    DECLARE @cmd nvarchar(max) = N' 
                                    select db_name(), value from sys.extended_properties
                                    where class_desc=''DATABASE'' and name = ''Application Name'';';

                                    EXEC master.dbo.sp_ineachdb @command = @cmd, @user_only = 1;






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Apr 2 at 13:50









                                    KinKin

                                    54.3k481192




                                    54.3k481192






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Database Administrators Stack Exchange!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233746%2fobtaining-database-information-and-values-in-extended-properties%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                                        Alcedinidae

                                        Origin of the phrase “under your belt”?