SQL Server:如何迭代函数参数

时间:2010-04-30 11:54:09

标签: sql sql-server-2005 sql-server-2008 function cursor

我正在尝试学习SQL,为了演示目的,我想创建一个迭代函数参数的循环。例如。我想迭代SERVERPROPERTY函数参数(propertynames)。我可以像这样单选:

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

但是如何迭代这个内置函数的所有属性名?提前谢谢。

5 个答案:

答案 0 :(得分:0)

据我所知,我认为你不能这样做。它是一个具有设置PropertyNames的系统函数,以获取特定的详细信息。

HTH

答案 1 :(得分:0)

我不认为这是一种内置的方式,但请看看这是否符合您的要求:http://www.sqlservercentral.com/scripts/Replication/31229/

答案 2 :(得分:0)

您可以使用INFORMATION_SCHEMA.PARAMETERS查看用户创建的对象的参数。

然而SERVERPROPERTY不会出现在那里。但是,您要求的不是迭代参数,而是迭代propertyname的{​​{1}}参数的实际值。

SERVERPROPERTY

这些值已记录在案,并且在您安装了另一个版本的SQL Server之前不应更改,因此硬编码并在此处创建光标:

SERVERPROPERTY ( propertyname )

输出:

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'

答案 3 :(得分:0)

我认为在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
    ) ;

我已在此示例中以列和行生成它。

答案 4 :(得分:0)

您可以使用光标执行此操作(标记为):

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