我在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
答案 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 ║
╚═══╩════════════════╩════════════════╩═══════════════╝