Я пытаюсь передать значения в таблицу многозначных параметров хранимой процедуры, как это:Игнорирование столбца идентификации при передаче значения параметра табличного
DataTable Entries = new DataTable();
Entries.Columns.Add("InfoID", typeof (int));
Entries.Columns.Add("InfoValue", typeof (string));
foreach(FormInfoValue entry in FormEntries) {
Entries.Rows.Add(entry.InfoID, entry.InfoValue);
}
DataSet res = ExecuteStoredProcedure("SaveData", new SqlParameter[] {
new SqlParameter() {
DbType = DbType.String, ParameterName = "@FormID", Value = FormID
},
new SqlParameter() {
SqlDbType = SqlDbType.Structured, ParameterName = "@InfoValues", Value = Entries
},
new SqlParameter() {
DbType = DbType.Int32, ParameterName = "@UserID", Value = Security.SessionControl.GetSession().UserID
}
});
return int.Parse(res.Tables[0].Rows[0][0].ToString());
Но проблема в том, что табличное значении параметр @InfoValues
имеет один дополнительный столбец, который является личным. Я использую этот столбец в своей логике в хранимой процедуре. Но на C# его исключение бросания состоит из 3 столбцов вместо 2 в @InfoValues
. Как передать значения, игнорируя столбец идентификаторов в этом параметре таблицы?
UPDATE
Я пытался использовать временную таблицу в качестве решения, как это:
DECLARE @FormData TABLE (
ID INT IDENTITY(1,1) NOT NULL,
InfoID INT NULL,
InfoValue NVARCHAR(MAX) NULL
)
INSERT INTO @FormData(InfoID,InfoValue) SELECT [InfoID],[InfoValue] FROM @InfoValues
WHILE (1 = 1)
BEGIN
EXEC [dbo].OpenKeys
SELECT TOP 1 @iid = [ID], @id = InfoID, @value = InfoValue FROM @FormData WHERE [ID] > @iid ORDER BY [ID]
-- Exit loop if no more info values
IF @@ROWCOUNT = 0 BREAK;
INSERT INTO [InfoValues]([InfoID],[Value],[UserID],[DateAdded],[DateUpdated])
VALUES(@id,[dbo].ENCRYPTDATA(@value),@UserID,GETDATE(), GETDATE());
SET @retID = SCOPE_IDENTITY();
INSERT INTO EVMap(EntryID, ValueID) VALUES(@EntryID, @retID)
END
такой подход эффективен?
Почему бы не изменить вашу процедуру, чтобы использовать ROW_NUMBER вместо идентификатора? –
@SeanLange Для этого я думаю, что мне нужно изменить много кода. Могу ли я использовать временную таблицу, которая содержит первичный ключ? Сначала вставьте данные во временную таблицу и затем используйте ее в обработке? –
Это возможность. Трудно сказать, что является лучшим/простым способом, не зная, что делает ваша процедура. –