如何在Dynamic T-SQL中使用CAST?

时间:2014-01-24 23:42:48

标签: sql sql-server sql-server-2008 tsql

我在UPDATE语句中遇到Cast函数问题。具体来说,它发生在行

Y= CAST(SUBSTRING(@p,CHARINDEX(',',@p),LEN(@p)) AS DECIMAL(38,10))

。 IT不允许我提取我想要的数据。在此示例中,错误是“将数据类型nvarchar转换为数字时出错”。同样错误发生在集合Y.我试图让X和Y脱离POINT。有人能告诉我Y语句会发生什么吗?我正在测试Y更新如下:

SELECT SUBSTRING('2532.3,32523.2'
                ,CHARINDEX(',','2532.3,32523.2')
                     ,LEN('2532.3,32523.2'));

它有效。我不知道它有什么问题。谢谢。

        CREATE TABLE dbo.POINTS (
         I      INT         IDENTITY NOT NULL
        ,Point  varchar(81)     NOT NULL
        ,X      decimal(38,10)  NULL
        ,Y      decimal(38,10)  NULL
        )
        GO
        INSERT dbo.POINTS (Point) VALUES ('(45.123,22.5)')
        INSERT dbo.POINTS (Point) VALUES ('(7.95,3.45)')
        INSERT dbo.POINTS (Point) VALUES ('(100.2,15.498)')
        GO



        Answer:
        DECLARE @p AS VARCHAR(81), @i AS INT =1;
        DECLARE CS CURSOR FAST_FORWARD FOR 
            Select Point FROM dbo.POINTS;
        OPEN CS
        FETCH NEXT FROM CS INTO @p;
        WHILE @@FETCH_STATUS=0
        BEGIN
            DECLARE @x AS INT = CHARINDEX(',',@p);
            UPDATE dbo.POINTS                   
            SET X = CAST(SUBSTRING(@p,2,@x-2) AS DECIMAL(38,10)),
            Y = CAST(SUBSTRING(@p,@x,LEN(@p)-@x-1) AS DECIMAL(38,10))
            WHERE I=@i;
            SET @i =@i+1;
            FETCH NEXT FROM CS INTO @p;
        END
        CLOSE CS
        DEALLOCATE CS

1 个答案:

答案 0 :(得分:1)

DECLARE @POINTS TABLE  (
 I      INT         IDENTITY NOT NULL
,Point  varchar(81)     NOT NULL
,X      decimal(38,10)  NULL
,Y      decimal(38,10)  NULL
)

INSERT @POINTS(Point) VALUES ('(45.123,22.5)')
INSERT @POINTS(Point) VALUES ('(7.95,3.45)')
INSERT @POINTS(Point) VALUES ('(100.2,15.498)')


UPDATE @POINTS
SET X  = CAST(LEFT(REPLACE(Point, '(', ''), CHARINDEX(',', Point)-2) AS  decimal(38,10)),
    Y = CAST(SUBSTRING(REPLACE(REPLACE(Point, '(', ''), ')', '')
      , CHARINDEX(',', Point), LEN(Point) 
        - LEN(LEFT(REPLACE(Point, '(', ''), CHARINDEX(',', Point)-2))) AS  decimal(38,10))

SELECT * FROM @POINTS

结果集

╔═══╦════════════════╦════════════════╦═══════════════╗
║ I ║     Point      ║       X        ║       Y       ║
╠═══╬════════════════╬════════════════╬═══════════════╣
║ 1 ║ (45.123,22.5)  ║ 45.1230000000  ║ 22.5000000000 ║
║ 2 ║ (7.95,3.45)    ║ 7.9500000000   ║ 3.4500000000  ║
║ 3 ║ (100.2,15.498) ║ 100.2000000000 ║ 15.4980000000 ║
╚═══╩════════════════╩════════════════╩═══════════════╝