1

(@name)パラメータを文字列として'Alex','david','crowner'ストアド プロシージャのクエリに渡す必要があります。

ストアド プロシージャのクエリは次のようになります。

select * 
from employees 
where name in (@name)

@name渡されるパラメータの値は次のようになります

'Alex','david','crowner'

INストアド プロシージャでこれを処理して、テーブル内の名前を演算子で検索するにはどうすればよいですか?

4

3 に答える 3

1

SQL Server 2008 以降では、テーブル値パラメーターを使用できます。データベースでは、テーブル タイプを作成する必要があります。例えば:

-- Drop old example definitions
if exists (select * from sys.procedures where name = 'TestProcedure')
    drop procedure TestProcedure
if exists (select * from sys.types where name = 'TestTableType')
    drop type TestTableType
if exists (select * from sys.tables where name = 'TestTable')
    drop table TestTable
go    
-- Create example table, type and procedure
create table TestTable (id int identity, name varchar(50))
create type TestTableType as table (name varchar(50))
go
insert TestTable values ('Bill'), ('George'), ('Barrack')
go
create procedure dbo.TestProcedure
    @List TestTableType readonly
as
select  *
from    TestTable
where   name in 
        (
        select  name
        from    @List
        )
go

C# では、DataTablea をテーブル値パラメーターとして渡すことができます。

var listTable = new DataTable();
listTable.Columns.Add("Name", typeof(string));
listTable.Rows.Add("Bill");
listTable.Rows.Add("George");

var listParameter = new SqlParameter();
listParameter.ParameterName = "@List";
listParameter.Value = listTable;

using (var con = new SqlConnection("Server=localhost;Database=test;" + 
                                   "User Id=testuser;Password=testpassword;"))
{
    var com = con.CreateCommand();
    com.CommandText = "dbo.TestProcedure";
    com.CommandType = CommandType.StoredProcedure;
    com.Parameters.Add(listParameter);
    con.Open();
    using (var read = com.ExecuteReader())
    {
        while (read.Read())
            Console.WriteLine(read["name"]);
    }
}

テーブル値パラメーターが 1 つでも必要なコードの量と複雑さは、SQL Server の設計者を補うものではありません。

于 2013-07-14T11:04:07.590 に答える
0

単一の文字列をパラメーターに渡し、ストアド プロシージャの本体内で charindex や substring などの関数を使用して、必要なことを行うことができます。

于 2013-07-14T06:52:26.073 に答える