【问题标题】:Problem with text datatype and UDF文本数据类型和 UDF 的问题
【发布时间】:2011-03-18 16:17:17
【问题描述】:

我有一个很棒的功能,可以将一个字段解析为一个由四列组成的数据透视表,这样我就可以对我的表进行相应的排序。我现在唯一的问题是我不能在查询中使用该函数,该函数还调用“文本”数据类型以显示在结果中。只要我不包含作为“文本”数据类型的“spName”,查询就可以正常运行。我尝试过使用 cast 和 convert,但是在这个查询中内置函数都不起作用。谢谢。

错误:

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)-@NumericIndex+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)-@NonNumericIndex+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

【问题讨论】:

    标签: user-defined-functions sqldatatypes


    【解决方案1】:

    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;
    

    【讨论】:

    • 酷!我在两个选择语句中都在标题周围运行环绕转换,在第一个中调用标题别名并在第二个中环绕标题。
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2023-04-05
    • 2020-04-16
    • 2011-08-22
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多