SQL Server: как перебирать аргументы функций - PullRequest
1 голос
/ 30 апреля 2010

Я пытаюсь выучить SQL, и в демонстрационных целях я хотел бы создать цикл, который перебирает аргументы функции. Например. Я хотел бы перебрать аргументы функции SERVERPROPERTY (имена свойств). Я могу сделать один выбор, как это:

SELECT
SERVERPROPERTY('ProductVersion') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel,
SERVERPROPERTY('Edition') AS Edition,
SERVERPROPERTY('EngineEdition') AS EngineEdition;
GO

а как перебрать ВСЕ имена свойств этой встроенной функции? Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 30 апреля 2010

Вы можете сделать это (как вы отметили) с помощью курсора:

/* put props in a table */
DECLARE @T TABLE (PROP VARCHAR(128))
INSERT @T
    SELECT 'ProductVersion' 
    union select 'ProductLevel'
    union select 'Edition'
    union select 'EngineEdition'

/* iterate */
DECLARE Cur CURSOR FAST_FORWARD FOR SELECT PROP FROM @T
DECLARE @PROP VARCHAR(128) 
OPEN Cur

FETCH NEXT FROM Cur INTO @PROP

WHILE @@FETCH_STATUS = 0 BEGIN
  SELECT @PROP + ' is ' + CAST(SERVERPROPERTY(@PROP) AS VARCHAR(128))
  FETCH NEXT FROM Cur INTO @PROP
END

CLOSE Cur
DEALLOCATE Cur 

Или когда у вас есть @ T

SELECT PROP + ' is ' + CAST(SERVERPROPERTY(PROP) AS VARCHAR(128)) FROM @T
0 голосов
/ 30 апреля 2010

Я думаю, что где-то в SQL Server есть таблица допустимых свойств SERVERPROPERTY, но вы можете просто добавить ее в свое приложение. Эта подпрограмма создает переменную таблицы, заполняет ее и генерирует динамический SQL, который создает строку со столбцами по вашему желанию, а также преобразует вещи в их базовый базовый тип.

SET NOCOUNT ON

DECLARE @props AS TABLE
    (
     propname VARCHAR(255)
    ,datatype VARCHAR(50)
    ) ;

INSERT  INTO @props
VALUES  (
         'ProductVersion'
        ,'nvarchar(128)' 
        ) ;
INSERT  INTO @props
VALUES  (
         'ProductLevel'
        ,'nvarchar(128)' 
        ) ;
INSERT  INTO @props
VALUES  (
         'Edition'
        ,'nvarchar(128)' 
        ) ;
INSERT  INTO @props
VALUES  (
         'EngineEdition'
        ,'int' 
        ) ;

DECLARE @sql AS VARCHAR(MAX) ;

SELECT  @sql = ( SELECT ', CAST(SERVERPROPERTY(''' + propname + ''') AS '
                        + datatype + ') AS ' + propname
                 FROM   @props
               FOR
                 XML PATH('')
               ) ;

SET @sql = 'SELECT' + STUFF(@sql, 1, 1, '') + ';' ;

PRINT @sql ; 
EXEC ( @sql
    ) ;

SELECT  @sql = ( SELECT ' UNION ALL SELECT ''' + propname
                        + ''' AS PropertyName, SERVERPROPERTY(''' + propname
                        + ''') AS PropertyValue'
                 FROM   @props
               FOR
                 XML PATH('')
               ) ;

SET @sql = STUFF(@sql, 1, LEN(' UNION ALL '), '') + ';' ;

PRINT @sql ;
EXEC ( @sql
    ) ;

Я сгенерировал его в столбцах и строках в этом примере.

0 голосов
/ 30 апреля 2010

Я не думаю, что есть встроенный способ сделать это, но посмотрите здесь, чтобы увидеть, делает ли это то, что вам нужно: http://www.sqlservercentral.com/scripts/Replication/31229/

0 голосов
/ 30 апреля 2010

Вы можете использовать INFORMATION_SCHEMA.PARAMETERS для просмотра параметров созданных пользователем объектов.

Однако SERVERPROPERTY не появится в этом. Тем не менее, то, что вы запрашиваете, - это не перебор параметров, а фактические значения параметра propertyname SERVERPROPERTY.

SERVERPROPERTY ( propertyname )

Значения задокументированы и не должны изменяться до тех пор, пока не будет установлена ​​другая версия SQL Server, поэтому жестко запишите код и создайте свой курсор на этом:

SELECT SERVERPROPERTY('ProductVersion') AS Value , 'ProductVersion' as TypeOf
UNION ALL SELECT SERVERPROPERTY('ProductLevel')  , 'ProductLevel'
UNION ALL SELECT SERVERPROPERTY('Edition')       , 'Edition'
UNION ALL SELECT SERVERPROPERTY('EngineEdition') , 'EngineEdition'

ВЫВОД:

Value                      TypeOf            
-------------------------- ------------------
9.00.3042.00               ProductVersion    
SP2                        ProductLevel      
Standard Edition           Edition           
2                          EngineEdition     

(4 row(s) affected)
0 голосов
/ 30 апреля 2010

Насколько я знаю, я не думаю, что вы можете сделать это. Это системная функция с установленным PropertyNames для получения конкретных деталей.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...