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