Исходная ссылка на тип данных при использовании 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";
Другие вопросы по тегам