2010-07-20 7 views
1

J'ai cette grande fonction qui analyse un champ dans un tableau croisé dynamique composé de quatre colonnes afin que je puisse trier ma table en conséquence. Mon seul problème maintenant est que je ne peux pas utiliser la fonction dans une requête qui appelle aussi un type de données "texte" à afficher dans les résultats. La requête fonctionne correctement tant que je n'inclue pas "spName" qui est un type de données "text". J'ai essayé d'utiliser cast et de convertir mais aucune des fonctions intégrées ne fonctionnent dans cette requête. Merci.Problème avec le type de données textuel et UDF

erreur:

Pivot grouping columns must be comparable. The type of column "spName" is "text", which is not comparable. 

recherche:

SELECT title, recID, spName, [1] AS [Col1], [2] AS [Col2],[3] AS [Col3],[4] AS [Col4] 
FROM (select title, recID, spName from TestTable) t CROSS APPLY dbo.GetNumbers(title) PIVOT (MAX(num) FOR idx IN ([1], [2],[3],[4])) AS PivotTable ORDER BY Col1 

udf:

CREATE FUNCTION GetNumbers 
( 
@Numbers NVARCHAR(2000) 
) 
RETURNS @Results TABLE 
( 
idx INT IDENTITY(1,1), 
num INT 
) 
AS 
BEGIN 
    DECLARE @NonNumericIndex INT, @NumericIndex INT 

    SET @NumericIndex = PATINDEX('%[0-9]%',@Numbers) 

    IF (@NumericIndex > 4) --First Column not there 
      INSERT INTO @Results VALUES (NULL) 

    WHILE @NumericIndex > 0 
    BEGIN 
     SET @Numbers = RIGHT(@Numbers,LEN(@Numbers)[email protected]+1) 

     SET @NonNumericIndex = PATINDEX('%[^0-9]%',@Numbers) 

     IF(@NonNumericIndex = 0) 
     BEGIN 
      INSERT 
      INTO @Results VALUES (@Numbers) 
      RETURN 
     END 
     ELSE 
     INSERT 
     INTO @Results VALUES 
      (LEFT(@Numbers,@NonNumericIndex-1)) 

     SET @Numbers = RIGHT(@Numbers,LEN(@Numbers)[email protected]+1) 
     SET @NumericIndex = PATINDEX('%[0-9]%',@Numbers) 
    END 
    RETURN 
END 
données

échantillon

title     recid   spname 
QW 1 RT 309-23-1   1    This is title 1 words 
QW 1 RT 29-1    2    this is title 2 desc 
QW 1 RT 750-1    3    This is title 3 
QW RT 750-1    4    This is title 4 words 

Répondre

0

Le type de données Text est obsolète et sonne un choix douteux pour un champ de nom dans tous les cas.

Cela fonctionne pour moi

IF OBJECT_ID('tempdb..#TestTable') IS NULL 
BEGIN 
CREATE TABLE #TestTable 
(
recid INT PRIMARY KEY, 
title VARCHAR(50), 
spName TEXT 
) 


INSERT INTO #TestTable 
SELECT 1 AS recid, 'QW 1 RT 309-23-1' AS title, CAST('test1' AS TEXT) AS spName UNION ALL 
SELECT 2 AS recid, 'QW 1 RT 29-1', CAST('test' AS TEXT) AS spName UNION ALL 
SELECT 3 AS recid, 'QW 1 RT 750-1', CAST('test' AS TEXT) AS spName UNION ALL 
SELECT 4 AS recid, 'QW RT 750-1' , CAST('test' AS TEXT) AS spName 
END 

SELECT recid, title, spName, [1] AS [COLUMN 1], [2] AS [COLUMN 2],[3] AS [COLUMN 3],[4] AS [COLUMN 4] 
FROM 
    (SELECT recid, title, CAST(spName AS VARCHAR(MAX)) AS spName FROM #TestTable) T 
    CROSS APPLY dbo.GetNumbers(title) 
PIVOT 
(MAX(num) FOR idx IN ([1], [2],[3],[4]) 
) AS PivotTable; 
+0

cool! Je courais autour du titre de cast dans les deux déclarations select verses appelant l'alias de titre dans le premier et l'emballage autour du titre sur le second. – gates

Questions connexes