1

我正在创建一个具有 SQLVariant 数据类型的表。存储在变量列中的值可以是stringinteger和/或datetime。我读到了 sqlvariant 的陷阱,但由于该列没有被索引,或者在 WHERE 子句中使用,它似乎是最好的选择。但是,我需要存储对 SqlVariant 应该从/到转换的适当数据类型的引用。

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

在此处输入图像描述

我在 TSQL 中看不到等效的系统,所以想知道在使用它时如何引用每种数据类型应该是什么。每个 TSQL 数据类型都有一个“ID”吗?

这个要求的原因是客户端将值作为 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>

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

更新

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

SELECT * FROM sys.types

请问system_type_id这里是我需要的值吗?

4

1 回答 1

2

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

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";
于 2017-04-28T09:20:35.353 回答