使用 Sql_Variant 时的原始数据类型引用

Original data type reference when using Sql_Variant

我正在创建一个具有 SQLVariant 数据类型的 table。变体列中存储的值可以是 stringinteger、and/or datetime。我了解了 sqlvariant 的陷阱,但由于该列没有被索引,也没有在 WHERE 子句中使用,它似乎是最好的选择。但是,我需要存储对 SqlVariant 应该转换的适当数据类型的引用 from/to.

在 Microsoft .Net(我的应用程序)中,每个 SQL data type 都有一个基础数值:

我在 TSQL 中看不到等效的系统,所以想知道在使用它时如何引用每种数据类型。每个 TSQL 数据类型是否有 "ID"

此要求的原因是客户端将值作为 XML 传递给过程,该过程将值保存到 table,例如

<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>

我应该只使用 .Net 中的 SqlDbType 值,还是有更好的方法?

更新

我想我可能发现了什么...

SELECT * FROM sys.types

请问system_type_id是我需要的值吗?

您可以创建用户定义的 table 类型以将参数数组作为 table 值参数传递:

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代码

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";