2010-07-20 5 views
1

У меня есть эта замечательная функция, которая анализирует поле в сводной таблице, состоящей из четырех столбцов, чтобы я мог сортировать таблицу соответственно. Моя единственная проблема в том, что я не могу использовать функцию в запросе, который также вызывает «тип данных», который будет отображаться в результатах. Запрос выполняется нормально, пока я не включаю «spName», который является «текстовым» типом данных. Я пробовал использовать листинг и конвертировать, но ни один из встроенных функций не работает в этом запросе. Благодарю.Проблема с текстовым типом данных и UDF

ошибка:

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

запроса:

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 

выборки данных

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 

ответ

0

Тип данных Text устарел и звучит сомнительным выбором для поля имени в любом случае.

Это работает для меня

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

круто! Я запускал обертку, набрасывающую название, в обоих случаях, в которых вызывается выражение, называющее псевдоним заголовка в первом, и обертывание вокруг второго заголовка. – gates

Смежные вопросы