У меня есть хранимая процедура, которая принимает определяемый пользователем тип таблицы в качестве параметра.В C # я использую SqlDataRecord и SqlMetaData (и SqlParameter), чтобы создать параметр таблицы с моими данными и отправить его в хранимую процедуру.
Это прекрасно работает, когда столбцы (SqlMetaData) находятся в том же порядке, что и столбецопределения внутри фактического типа таблицы sql-сервера.Если они НЕ в одном и том же порядке, то будут сопоставлены неправильные столбцы.
Так в чем же смысл свойства SqlMetaData.Name?Кажется, он игнорируется (по крайней мере, для этого варианта использования), и учитывается только порядок столбцов (и данных).
Пример ...
У меня есть тип таблицы в SQL:
CREATE TYPE [dbo].[TestingTableParamType] AS TABLE(
[FName] VARCHAR(50) NULL,
[Numb] INT NULL,
[LName] VARCHAR(50) NULL
);
У меня есть хранимая процедура:
CREATE PROCEDURE spTEST_TableParam
@input TestingTableParamType READONLY
AS
SELECT FName, Numb, LName FROM @input
И у меня есть метод генерации тестовых данных, который дает три строки тестовых данных ссоответствующие типы столбцов в соответствующем порядке (чтобы соответствовать определению TestingTableParamType). Обратите внимание, однако, что я использую пустые строки в качестве имен! Я пробовал с бессмысленными строками, и это также работало нормально (null приведет к исключению):
private IEnumerable<SqlDataRecord> genTestSqlDataRecords()
{
SqlDataRecord record = new SqlDataRecord(
new SqlMetaData("", SqlDbType.VarChar, 50),
new SqlMetaData("", SqlDbType.Int),
new SqlMetaData("", SqlDbType.VarChar, 50));
record.SetValues("fn1", 101, "ln1");
yield return record;
record.SetValues("fn2", 102, "ln2");
yield return record;
record.SetValues("fn3", 103, "ln3");
yield return record;
}
Можно попытаться указатьимена столбцов и переупорядочение столбцов SqlMetaData, но он просто использует порядок столбцов для связи с типом таблицы, а не с именами столбцов.
Существует еще некоторый код, который выполняет сама база данных, вотсоответствующий фрагмент:
...
SqlParameter param = new SqlParameter("@input", SqlDbType.Structured);
param.Direction = ParameterDirection.Input;
param.TypeName = "TestingTableParamType";
param.Value = genTestSqlDataRecords();
dbCommand.Parameters.Add(param);
conn.Open();
var dataReader = dbCommand.ExecuteReader();
...
Итак, похоже, что свойство SqlMetaData (column) Name не имеет значения, по крайней мере, для этого варианта использования.Это создает вводящий в заблуждение код - в том смысле, что вы можете изменить порядок столбцов (и данных), и он должен соответствовать их именам, но этого не происходит!
Кроме того, во всех примерахвидел использование SqlDataRecord и SqlMetaData для передачи параметров типа таблицы, предоставляющих имена для своих столбцов, как будто это необходимо.
Что я пропустил во всем этом?Спасибо, любезно.