2010-04-30 68 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