Исходная ссылка на тип данных при использовании Sql_Variant
Я создаю таблицу с типом данных SQLVariant. Значения, хранящиеся в столбце вариантов, могут быть строковыми, целыми и / или datetime. Я читал о подводных камнях sqlvariant, но поскольку столбец не индексируется и не используется в предложениях WHERE, он кажется лучшим выбором. Тем не менее, мне нужно сохранить ссылку на соответствующий тип данных, из которого / S должен быть приведен SqlVariant.
В Microsoft .Net (мое приложение) каждый тип данных SQL имеет базовое числовое значение:
Я не вижу эквивалентной системы в TSQL, поэтому мне было интересно, как я ссылаюсь на то, каким должен быть каждый тип данных при его использовании. Есть ли "ID" для каждого типа данных TSQL?
Причина этого требования заключается в том, что клиент передает значения в виде XML в процедуру, которая сохраняет значения в таблице, например
<parameters>
<p ID="1" Value="2017-04-28" Type="?????" /> Perhaps the SqlDbType integer value from above (4), or an equivalient TSQL identifier?
<p ID="2" Value="123" Type="Integer" />
<p ID="3" Value="123.456" Type="Double" />
<p ID="4" Value="Foo Bar" Type="String" />
</parameters>
Должен ли я просто использовать значение SqlDbType из.Net, или есть лучший способ?
ОБНОВИТЬ
Думаю, я мог что-то найти...
SELECT * FROM sys.types
Является system_type_id
значение мне нужно здесь, пожалуйста?
1 ответ
Вы можете создать пользовательский тип таблицы для передачи массива параметров в виде табличного параметра:
Код SQL:CREATE TYPE MyType AS TABLE (ID int, Value Sql_Variant)
CREATE PROCEDURE SP_NAME
@Values dbo.MyType READONLY
AS
--@Values is usual table variable (but readonly) and you can select from it like from tables in database
INSERT INTO SomeDBTable
SELECT *
FROM @Values V
WHERE V.ID <= 100500
.NET Code
DataTable dtList = new DataTable();
List<SqlDataRecord> filterList = new List<SqlDataRecord>();
foreach (KeyValuePair<string, object> filter in arrFilterList)
{
SqlDataRecord record;
record = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("ID", SqlDbType.Int),
new SqlMetaData("Value", SqlDbType.Variant) });
record.SetInt(0, filter.Key);
record.SetValue(1, filter.Value);
filterList.Add(record);
}
SqlCommand oCommand = new SqlCommand("SP_NAME", connection);
oCommand.CommandType = CommandType.StoredProcedure;
oCommand.Parameters.AddWithValue("@Values", filterList.Count > 0 ? filterList : null);
oCommand.Parameters["@Values"].SqlDbType = SqlDbType.Structured;
oCommand.Parameters["@Values"].TypeName = "dbo.MyType";