2014-01-24 21 views
2

我在UPDATE語句中使用Cast Function時遇到問題。具體而言,它發生在行如何在動態T-SQL中使用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)[email protected]) AS DECIMAL(38,10)) 
      WHERE [email protected]; 
      SET @i [email protected]+1; 
      FETCH NEXT FROM CS INTO @p; 
     END 
     CLOSE CS 
     DEALLOCATE CS 
+0

從這個字符串'45.123,22.5'你想投的十進制值是什麼??? –

+0

這些值中的每一個都是十進制的。 CAST將爲45.123,22.5中的每個值工作。 45.123將被鑄造並插入到X中,22.5將被鑄造並插入到Y. – user1874435

+0

一個CURSOR中進行如此簡單的操作:S –

回答

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 ║ 
╚═══╩════════════════╩════════════════╩═══════════════╝ 
+0

感謝您回答這個問題,但這種情況下的問題是創建和插入表已經完成了。我必須創建一個函數或其他東西來改變數據。 – user1874435

+0

非常感謝。現在我必須用()替換(),並且問題已經修復 – user1874435