【问题标题】:MS-SQL stored procedure to MySQLMS-SQL 存储过程到 MySQL
【发布时间】:2013-06-12 09:40:51
【问题描述】:

谁能帮我把下面的 MS-SQL sp 写到 MySQL sp,

使用这个:

CREATE PROCEDURE sp_InputWork 
    @_DelimitedString nvarchar(MAX) 
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @_DataRow nvarchar(MAX)
    DECLARE @_DescriptionOfWorkDone nvarchar(MAX)
    DECLARE @_TemporaryStorage nvarchar(MAX)
    DECLARE @_QTY int
    DECLARE @_Total int
    DECLARE @_CurrentField int

    WHILE CHARINDEX(';', @_DelimitedString) > 0
    BEGIN
        SET @_DataRow = CAST(SUBSTRING(@_DelimitedString, 0, CHARINDEX(';', @_DelimitedString)) AS nvarchar(MAX))
        SET @_CurrentField = 1
        WHILE CHARINDEX(',', @_DataRow) > 0
            BEGIN
            SET @_TemporaryStorage = CAST(SUBSTRING(@_DataRow, 0, CHARINDEX(',', @_DataRow)) AS nvarchar(MAX))
            IF @_CurrentField = 1
                SET @_QTY = CAST(@_TemporaryStorage AS int)
                    IF @_CurrentField = 2
            SET @_DescriptionOfWorkDone = @_TemporaryStorage
                    IF @_CurrentField = 3
                    SET @_Total = CAST(@_TemporaryStorage AS int)           
            SET @_DataRow = SUBSTRING(@_DataRow, CHARINDEX(',', @_DataRow) + 1, LEN(@_DataRow))
            SET @_CurrentField = @_CurrentField + 1
        END
        INSERT INTO tblWorkDone (QTY, DescriptionOfWorkDone, Total) VALUES (@_QTY, @_DescriptionOfWorkDone, @_Total)
        SET @_DelimitedString = SUBSTRING(@_DelimitedString, CHARINDEX(';', @_DelimitedString) + 1, LEN(@_DelimitedString))
        END 
END 

【问题讨论】:

  • 您遇到了什么错误,您尝试过什么?
  • @RaviSingh 我正在做的是将一个字符串传递给 SP,例如 (a, test,100.00, 1;b,test1,150.00, c;) 即由逗号分隔的字段和由分隔的值设置分号,我希望 SP 循环通过值集,然后通过字段然后插入到表中。我还没有在 Mysql 中尝试过这个。我从一个站点 [link]vbforums.com/… 得到了这个 sp
  • 这应该可以在 mysql 中进行更改:1) 将 charindex 更改为 instr()。 2) 使用IF..THEN 而不是IF
  • @RaviSingh while 循环怎么样,在 mysql 中就像 while .....do .... end while;和 nvarchar 到 textblob???。会有用吗???
  • 是的,那个也是。

标签: mysql sql-server string delimiter


【解决方案1】:

我已经把SP改成Mysql了

BEGIN
DECLARE _DataRow VARCHAR(21000);
 DECLARE _DescriptionOfWorkDone VARCHAR(21000);
DECLARE _TemporaryStorage VARCHAR(21000) ;
DECLARE _QTY int;
DECLARE _Total int;
DECLARE _CurrentField int;

WHILE INSTR(_DelimitedString, ';') >0 DO

    SET _DataRow = CAST(SUBSTRING(_DelimitedString, 1, INSTR(_DelimitedString,';' )) AS CHAR);
    SET _CurrentField = 1;
    WHILE INSTR(_DataRow,',' ) > 0 DO         
        SET _TemporaryStorage = CAST(SUBSTRING(_DataRow, 1, INSTR(_DataRow,',' )-1) AS CHAR);
        IF _CurrentField = 1 then
            SET _QTY = CAST(_TemporaryStorage AS UNSIGNED);
                end if;
                      IF _CurrentField = 2 then
        SET _DescriptionOfWorkDone = _TemporaryStorage;
                end if;
                      IF _CurrentField = 3 then
                SET _Total = CAST(_TemporaryStorage AS UNSIGNED)    ;   
                     end if;    

        SET _DataRow = SUBSTRING(_DataRow, INSTR( _DataRow,',') + 1, LENGTH(_DataRow));
        SET _CurrentField = _CurrentField + 1;
         END while;

    INSERT INTO tblWorkDone (QTY, DescriptionOfWorkDone, Total) VALUES (_QTY, _DescriptionOfWorkDone, _Total);
    SET _DelimitedString = SUBSTRING(_DelimitedString, INSTR(_DelimitedString,';' ) + 1, LENGTH(_DelimitedString));

   END WHILE;END

数据插入

CALL `sp_InputWork`('1,TEST,100,;2,TEST1,200,;3,TEST3,300,;')

成功循环插入Mysql Table

【讨论】:

  • 对不起,如果我读错了,但这不是解决方案吗? (假设您不认为“所有字段为空”是正确的)。如果是这样:请不要将其作为答案发布,而是更新您的问题:这不是您的典型论坛,这是一个问答网站,“您的答案”框不是实际答案:)
  • @Nanne 终于搞定了,并发布了正确答案,很抱歉将我的问题更新为答案
猜你喜欢
  • 2010-12-23
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多