none
插入数据问题 RRS feed

  • 问题

  • 问题描述:数据库有一张表,结构如下:

    columnA    columnB    columnC

      自增长       ID               被分解的string

     

    现在通存储过程需要向这张表里插入数据。存储过程需要两个参数,一个是ID,一个是一个string类型的值(形式如:1,2,3)。比如ID为1;string的值为1,2,3。我需要插入到表后的结果如下:

    columnA    columnB    columnC

        1                1               1

        2                1               2

        3                1               3

     

    请教各位怎么实现?比较急!在线等。先谢谢各位。

    2008年12月26日 6:15

答案

  • OK,下面是2005的方法:

     

    Code Snippet

     

    USE tempdb
    GO

    CREATE TABLE TEST
    (
       
    COL1 INT IDENTITY(1,1),
       
    COL2 INT,
       
    COL3 VARCHAR(10)
    )
    GO

    CREATE PROC P_TEST
    @id INT,
    @string VARCHAR(10)
    AS
    SET 
    NOCOUNT ON

    DECLARE 
    @x xml

    SET @x CONVERT(xml,'<root><value>'
           
    REPLACE(@string,',','</value><value>'
           + 
    '</value></root>')

    INSERT TEST
    (
       
    COL2,
       
    COL3
    )

    SELECT
       
    @id,
       
    T.c.value('.','varchar(10)')
    FROM @x.nodes('root/value'T(c)

    GO

    DECLARE
       
    @id INT,
       
    @string VARCHAR(10)

    SELECT
       
    @id 1,
       
    @string '1,2,3,4'

    EXEC P_TEST @id,@string

    SELECT FROM TEST
    GO


    DROP PROC P_TEST
    DROP TABLE TEST
    GO
    /**
    1  1   1
    2  1   2
    3  1   3
    4  1   4
    **/

     

     

     

    2008年12月26日 6:53
    版主

全部回复

  •  

    参考(适用2000/2005版本):

     

    Code Snippet

    USE tempdb
    GO

    CREATE TABLE TEST
    (
       
    COL1 INT IDENTITY(1,1),
       
    COL2 INT,
       
    COL3 VARCHAR(10)
    )
    GO

    CREATE PROC P_TEST
    @id INT,
    @string VARCHAR(10)
    AS
    SET 
    NOCOUNT ON

    DECLARE 
    @sql VARCHAR(1000)

    SET @sql '
    INSERT TEST
    (
    COL2,
    COL3
    )
    SELECT ' 
    CONVERT(VARCHAR(10),@id) + ',''' 
    REPLACE(@string,',',''' UNION ALL SELECT '
    CONVERT(VARCHAR(10),@id) +',''') + ''''

    EXEC(@SQL)
    GO

    DECLARE
       
    @id INT,
       
    @string VARCHAR(10)

    SELECT
       
    @id 1,
       
    @string '1,2,3,4'

    EXEC P_TEST @id,@string

    SELECT FROM TEST
    GO


    DROP PROC P_TEST
    DROP TABLE TEST
    GO
    /**
    1  1   1
    2  1   2
    3  1   3
    4  1   4
    **/

     

     

    2008年12月26日 6:41
    版主
  • 在2005下,还可以通过构造成XML数据类型,然后使用NODES方法,来遍历插入,这个

    你可以在网络搜索一下,很多例子.

    2008年12月26日 6:43
    版主
  • To:CN_SQL:您好,谢谢您的回复。我的数据库是SQL2005,请教如何实现您说的方法。能不能就我给的数据库列子麻烦您写个例子。谢谢先

    2008年12月26日 6:47
  • OK,下面是2005的方法:

     

    Code Snippet

     

    USE tempdb
    GO

    CREATE TABLE TEST
    (
       
    COL1 INT IDENTITY(1,1),
       
    COL2 INT,
       
    COL3 VARCHAR(10)
    )
    GO

    CREATE PROC P_TEST
    @id INT,
    @string VARCHAR(10)
    AS
    SET 
    NOCOUNT ON

    DECLARE 
    @x xml

    SET @x CONVERT(xml,'<root><value>'
           
    REPLACE(@string,',','</value><value>'
           + 
    '</value></root>')

    INSERT TEST
    (
       
    COL2,
       
    COL3
    )

    SELECT
       
    @id,
       
    T.c.value('.','varchar(10)')
    FROM @x.nodes('root/value'T(c)

    GO

    DECLARE
       
    @id INT,
       
    @string VARCHAR(10)

    SELECT
       
    @id 1,
       
    @string '1,2,3,4'

    EXEC P_TEST @id,@string

    SELECT FROM TEST
    GO


    DROP PROC P_TEST
    DROP TABLE TEST
    GO
    /**
    1  1   1
    2  1   2
    3  1   3
    4  1   4
    **/

     

     

     

    2008年12月26日 6:53
    版主
  • To:CN_SQL:非常感谢:)

    2008年12月26日 7:40