2

フロントエンド(studio 2008)から、次のようにSQLプロシージャに値を渡しています:

文字列 a = "こんにちは" + "098765" + "世界" + "90.0909"

これらは、文字列 a に連結した 4 つの異なる値です。

今度は、c# sqlCommand オブジェクトを使用して、この文字列を sql プロシージャに渡します。

さて、プロシージャを次のように作成したため、SQL プロシージャでこれらの 4 つの値を取得するにはどうすればよいですか。

create procedure Proc_name (@concatenated_string varchar(100))
as
insert into table1 values(**how can i get those 4 values here**).

配列を使用しましたが、機能しませんでした。

4

7 に答える 7

6

配列を SQL Server に渡して 1 つのテーブルの "複数行" の更新を処理する場合は、この有名な記事をお読みください。

汎用ストアド プロシージャで任意のテーブルを更新する場合は、他のコメントに従ってください。

于 2010-01-28T06:38:34.617 に答える
5

これを行う標準的な方法は、プロシージャで4つのパラメータを使用することです。

create procedure Proc_name (@param1 varchar(100), 
    @param2 varchar(100), 
    @param3 varchar(100), 
    @param4 varchar(100)) 
as 
insert into table1 values(@param1, @param2, @param3, @param4)

次に、コードから(ADO.NETを使用してac#の例を示します)

using (SqlConnection connection = new SqlConnection(connectionString))
{
    // Create the command and set its properties.
    SqlCommand command = new SqlCommand();
    SqlCommand command = new SqlCommand 
       ("Proc_name", connection); 

    command.CommandType = CommandType.StoredProcedure;

    // Add the input parameters and set the properties.
    SqlParameter parameter1 = new SqlParameter();
    parameter.ParameterName = "@Param1";
    parameter.SqlDbType = SqlDbType.NVarChar;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = param1;

    SqlParameter parameter2 = new SqlParameter();
    parameter.ParameterName = "@Param2";
    parameter.SqlDbType = SqlDbType.NVarChar;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = param2;

    // Same for params 3 and 4...


    // Add the parameter to the Parameters collection. 
    command.Parameters.Add(parameter1);
    command.Parameters.Add(parameter2);
    command.Parameters.Add(parameter3);
    command.Parameters.Add(parameter4);


    // Open the connection and execute the reader.
    connection.Open();
    SqlDataReader reader = command.ExecuteNonQuery();

    reader.Close();
}
于 2010-01-28T05:08:47.157 に答える
4

SQL Server 2005を使用している場合は、データをXMLパラメーターとしてストアドプロシージャに送信することを検討してください。このリンクはプロセスを完全に説明しています

.NET 3.5とC#を使用してコードがどのように表示されるかのサンプルセクションを次に示します。

//サンプルオブジェクト

[Serializable]
internal class MyClass
{
    internal string Property1 { get; set; }
    internal string Property2 { get; set; }
    internal int Property3 { get; set; }
    internal string Property4 { get; set; }
}

//サンプルのシリアル化

internal static string SerializeObject<T>(T objectGraph)   
{   
    StringBuilder sb = new StringBuilder();   

    XmlWriterSettings writerSettings = new XmlWriterSettings();   
    writerSettings.OmitXmlDeclaration = true;   
    writerSettings.Indent = true;   

    using (XmlWriter xmlWriter = XmlWriter.Create(sb, writerSettings))   
    {   
        XmlSerializer xs = new XmlSerializer(typeof(T));   
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();   
        ns.Add(String.Empty, String.Empty);   
        xs.Serialize(xmlWriter, objectGraph, ns);   
    }   

    return sb.ToString();   
}  

//ストアドプロシージャのサンプル

Create PROCEDURE [dbo].[MyProc]   
    @myClassXML XML   
AS   
BEGIN   
    INSERT INTO [dbo].[MyTable] 
    (   
        P1,   
        P2,   
        P3,   
        P4   
    )    
    SELECT    
        Container.ContainerCol.value('Property1[1]', 'varchar(50)') AS P1,   
        Container.ContainerCol.value('Property2[1]', 'varchar(50)') AS P2,     
        Container.ContainerCol.value('Property3[1]', 'int') AS P3,     
        Container.ContainerCol.value('Property4[1]', 'varchar(50)') AS P4,     
    FROM @myClassXML.nodes('//MyClass') AS Container(ContainerCol)    
END

ここで他の回答のアドバイスを読んでいて、一般的な「Insert Anything」ストアドプロシージャを作成していないことを前提としています。これは、実行できる最悪のことの1つだからです。

注:このコードはNotepad ++で記述されているため、テストされていません。

于 2010-01-28T06:51:35.757 に答える
1

4つの文字列をコンマで連結し、データベース内で分割することができます。

例えば

declare @values as nvarchar(1000)
set @values = 'hello,098765,world,90.0909'
SELECT * FROM split(@values) 

----------------  SPLIT FUNCTION  --------------
CREATE FUNCTION [dbo].[split]
(
    @csv nvarchar(max)
)
RETURNS 
@entries TABLE 
(
    entry nvarchar(100)
)
AS
BEGIN
    DECLARE @commaindex int
    SELECT @commaindex = CHARINDEX(',', @csv)

    IF @commaindex > 0 
    BEGIN
        INSERT INTO @entries
        -- insert left side
        SELECT LTrim(RTrim(LEFT(@csv, @commaindex-1)))
        -- pass right side recursively
        UNION ALL
        SELECT entry
        FROM dbo.split(RIGHT(@csv, LEN(@csv) - @commaindex))        
    END
    ELSE
        INSERT INTO @entries
        SELECT LTrim(RTrim(@csv))

    RETURN
END
于 2010-01-28T06:46:23.147 に答える
1

1ではなくいくつかのパラメータを使用します。例:

CREATE PROCEDURE [dbo].[addUser]

    @idRole int,  
    @userName varchar(255),  
    @password varchar(255)
    AS
    BEGIN
    set nocount on

    insert into userTbl (  idRole , userName , password  )
     VALUES (  @idRole , @userName , @password  )

    return scope_identity();
    END

    GO
于 2010-01-28T05:09:29.027 に答える
0

本当に 1 つのパラメーターだけを使用したい場合は、文字列ではなく XML パラメーターを検討してください。

于 2010-01-28T12:40:00.993 に答える