Sql server 使用Sql\u变量时的原始数据类型引用

Sql server 使用Sql\u变量时的原始数据类型引用,sql-server,tsql,sql-server-2012,sql-variant,Sql Server,Tsql,Sql Server 2012,Sql Variant,我正在创建一个具有SQLVariant数据类型的表。变量列中存储的值可以是字符串、整数、和/或日期时间。我读到了sqlvariant的缺陷,但由于该列没有被索引,也没有用于WHERE子句,因此它似乎是最佳选择。但是,我需要存储对SqlVariant应该从/转换到的适当数据类型的引用 在Microsoft.Net(我的应用程序)中,每个都有一个基础数值: 我在TSQL中看不到等效的系统,所以我想知道在使用它时如何引用每种数据类型。每个TSQL数据类型是否都有一个“ID” 此要求的原因是客户机将值

我正在创建一个具有SQLVariant数据类型的表。变量列中存储的值可以是字符串整数、和/或日期时间。我读到了sqlvariant的缺陷,但由于该列没有被索引,也没有用于WHERE子句,因此它似乎是最佳选择。但是,我需要存储对SqlVariant应该从/转换到的适当数据类型的引用

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

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

system\u type\u id
是我在这里需要的值吗?

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

SQL代码:
创建类型MyType作为表(ID int,Value Sql\u Variant)

创建过程SP\u名称
@值dbo.MyType只读
作为
--@值是常用的表变量(但只读),您可以像从数据库中的表中一样从中进行选择
插入到somedbable中
选择*
从@Values V
V.ID 0在哪里?过滤器列表:空);
oCommand.Parameters[“@Values”].SqlDbType=SqlDbType.Structured;
oCommand.Parameters[“@Values”].TypeName=“dbo.MyType”;

还有一个类型映射表,但表值类型比xml更好,TVP是以本机格式传递的,而不是字符串。如果您的命令有
CommandType=CommandType.storedProcess
则没有
EXEC SP_NAME
字符串。ADO.NET将使用RPC执行存储过程ReproFiler将其显示为EXEC,但这只是查询的可视化,我创建了它。有时创建数据类型是一个大问题。当您想要更改它时,您应该删除以前引用它的所有对象。在开始时:
创建类型dbo.MyType作为表(ID int,Value Sql\u Variant)
SELECT * FROM sys.types
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
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";