Estoy usando una modificación de su SQL original para propósitos de muestra.
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)
Puede usar un parámetro con valores de tabla
Aquí hay un ejemplo modificado tomado de Parámetros con valores de tabla en SQL Server 2008 (ADO. NETO)
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"]);
}
}
Pero necesita definir el tipo dbo.Names antes de que pueda funcionar
Aquí está el SQL de creación de tipos
CREATE TYPE dbo.Names AS TABLE
( Name VARCHAR(Max));
Otra opción es usar un Parámetro 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"]);
}
}