Sto utilizzando una modifica del tuo SQL originale a scopo di esempio.
DECLARE @list AS TABLE (Name VARCHAR(20));
INSERT INTO @list(Name)
VALUES ('PROCEDURE'),
('FUNCTION');
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE in (SELECT Name from @list)
Puoi utilizzare un parametro con valori di tabella
Ecco un esempio modificato tratto da Parametri con valori di tabella in SQL Server 2008 (ADO. NETTO)
using (SqlConnection cnn = new SqlConnection("Your connection string"))
{
var tableParam = new DataTable("names");
tableParam.Columns.Add("Name", typeof(string));
tableParam.Rows.Add(new object[] { "PROCEDURE" });
tableParam.Rows.Add(new object[] { "FUNCTION')" });
var sql = @"DECLARE @list AS TABLE (Name VARCHAR(20))
INSERT INTO @list(Name)
SELECT Name from @Names;
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE in (SELECT Name from @list)";
var sqlCmd = new SqlCommand(sql, cnn);
var tvpParam = sqlCmd.Parameters.AddWithValue("@Names", tableParam);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.Names";
cnn.Open();
using(SqlDataReader rdr = sqlCmd.ExecuteReader() )
{
while (rdr.Read())
Console.WriteLine(rdr["SPECIFIC_NAME"]);
}
}
Ma devi definire il tipo dbo.Names prima che possa funzionare
Ecco l'SQL di creazione del tipo
CREATE TYPE dbo.Names AS TABLE
( Name VARCHAR(Max));
Un'altra opzione consiste nell'utilizzare un Parametro XML
using (SqlConnection cnn = new SqlConnection("Your connection string"))
{
var sql = @"DECLARE @list AS TABLE (Name VARCHAR(20))
INSERT INTO @list(Name)
SELECT t.name.value('.', 'varchar(MAX)')
FROM @Names.nodes('/Names/Name') as T(Name);
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE in (SELECT Name from @list)";
var sqlCmd = new SqlCommand(sql, cnn);
var s = new MemoryStream(ASCIIEncoding.Default.GetBytes("<Names><Name>PROCEDURE</Name><Name>FUNCTION</Name></Names>"));
var xmlParam = new SqlXml(s);
sqlCmd.Parameters.AddWithValue("@Names", xmlParam);
cnn.Open();
using(SqlDataReader rdr = sqlCmd.ExecuteReader() )
{
while (rdr.Read())
Console.WriteLine(rdr["SPECIFIC_NAME"]);
}
}