2010-04-30 66 views
1

我想学习SQL和演示的目的,我想创建一个循环遍历函数参数。例如。我想迭代SERVERPROPERTY函数参数(propertynames)。我可以做这样的单选:SQL Server:如何遍历函数参数

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

但如何遍历此内置函数的所有属性名?提前致谢。

回答

0

据我所知,我认为你不能这样做。这是一个带有PropertyNames的系统函数来获取特定的细节。

HTH

0

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

但是SERVERPROPERTY不会出现在那。但是,您要求的是不要遍历参数,而是遍历SERVERPROPERTYpropertyname参数的实际值。

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' 

OUTPUT:

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

(4 row(s) affected) 
0

我想在SQL Server的某个地方有一个有效的SERVERPROPERTY属性表,但是你可以简单地在你的应用程序中添加一个表。这个例程生成一个表变量,填充它并生成动态SQL,该动态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

谢谢,但我一直在寻找遍历所有参数的声明这种内置功能。 – atricapilla 2010-04-30 12:28:14

+0

@atricapilla您将需要在SQL Server中查找包含它的系统表(我无法找到它)或从http://msdn.microsoft.com/en-us/library/ms174396.aspx手动构建表所有名字。从那里开始,代码的生成是不变的,因为它从表中驱动。 – 2010-04-30 12:35:26

+0

@atricapilla,不要懒得去找文档,并在 – 2010-04-30 12:38:41

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 
+0

谢谢,但是这不会遍历SERVERPROPERTY的所有函数参数,只是我在我的例子中描述的四个函数参数。 – atricapilla 2010-04-30 12:31:28