рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдпрд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдЧреБрдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╕рдордпред
ADO.NET рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╕рдВрднрд╡ рд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ sql_variant рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЗрд╖рд┐рдд рдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддрд░реНрдХ рдХреЛ рд╢рд╛рдЦрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ SQL_VARIANT_PROPERTY рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛рдПрдБ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред .NET рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ SqlDbType.Variant рдпрд╛ DbType.Object рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ , рд╣рдо рдкреНрд░рдмрдВрдзрди рдФрд░ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВред
- рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдБ:
CREATE TYPE [dbo].[GenericList] AS TABLE([value] [sql_variant] NOT NULL)
- рд╣рдо рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреА:
CREATE PROCEDURE [dbo].[ParseGenericList]
@list GenericList readonly
AS
BEGIN
SET NOCOUNT ON;
SELECT value from @list
END
- рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рд╣реИрдВрдбрд▓ рдХреЛ рд░рдЧрдбрд╝рдХрд░, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .NET рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
DataTable table = new DataTable("GenericList");
table.Columns.Add("value", typeof(object));
table.Rows.Add("string");
table.Rows.Add(DateTime.Now);
table.Rows.Add(145);
using (SqlCommand command = connection.CreateCommand()) // created before
{
command.CommandText = "dbo.ParseGenericList";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@list", table);
conn.Open();
using (SqlDataReader r = command.ExecuteReader())
while (r.Read())
Console.WriteLine(r.GetValue(0));
}
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкреЗрдХреНрд╖рд┐рдд рддреАрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдУрдмреНрд▓реЛрдорд┐рдВрдЧреЛ рдкрдХреНрд╖реА рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЙрдбрд╝рддрд╛ рд╣реИ:
"value" . "Object"
рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреНрд░рдорд╢рдГ рдСрдмреНрдЬреЗрдХреНрдЯ \ sql_variant рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ \ nvarchar рдпрд╛ рдлреНрд▓реЛрдЯ \ рдлреНрд▓реЛрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ:
declare @list dbo.GenericList;
insert into @list(value) select cast(0 as bit);
insert into @list(value) select cast('bla' as nvarchar(3));
insert into @list(value) select cast(0.15 as float);
exec dbo.ParseGenericList @list
рдЧреБрдЧреНрд▓рд┐рдВрдЧ рдХреЗ рдХреБрдЫ рдорд┐рдирдЯ Microsoft рддрдХрдиреАрдХреА рд╕рдорд░реНрдерди рдореЗрдВ рдПрдХ рдЦреБрд▓реА рд░рд┐рдкреЛрд░реНрдЯ рдкрд╛рддреЗ рд╣реИрдВ:
klats
рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЗ рдЕрдВрджрд░, рдПрдордПрд╕ рдЙрди рдкреИрдЪ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдПрдХ (рд╕реАрдЯреА рдХреЗ рд▓рд┐рдП) рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдерд╛, рджреВрд╕рд░реЗ (.net рдХреЗ рд▓рд┐рдП) рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд┐рдирд╛ред рдЪрд░реНрдЪрд╛ рд╕реНрд╡рдпрдВ рдХрд╣рддреА рд╣реИ рдХрд┐ рдмрдЧ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдореБрджреНрджрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдРрд╕реА рд╣реА рдПрдХ рдЕрдкреНрд░рд┐рдп рдХрд╣рд╛рдиреА рд╣реИред рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрдИ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдмреИрд╕рд╛рдЦреА):
- рдПрдХрд▓ рдЬреЗрдиреЗрд░рд┐рдХ sql_variant рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ (рдбреЗрдЯрд╛рдЯрд╛рдЗрдо, рдЗрдВрдЯ, рдлреНрд▓реЛрдЯ, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдХрдИ рд╕реВрдЪрд┐рдпрд╛рдБ рдкрд╛рд╕ рдХрд░реЗрдВ;
- рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕реВрдЪреА (string_value, value_type) рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐ рдореЗрдВ рд╕реАрдзреЗ sql_variant рдореЗрдВ рдорд╛рди рдбрд╛рд▓реЗрдВ;
- рдЖрд░рдпреВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕реАрдЖрд░рдпреВрдбреА рдореЗрдВ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдиреБрдкрдпреБрдХреНрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рдЖрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЪрд░рд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ sql_variant рдлрд╝реАрд▓реНрдб рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
- Xml- рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ sql_variant рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░;
рдпрд╣рд╛рдБ рдПрдХ рдмрдорд░ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЖрдХреНрд░реЛрд╢ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдПрдХ рднрд░рд╛ рд╣реБрдЖ рдмреЛрд▓реНрдЯ рд╣реИред