Я использую пользовательские типы таблиц, как показано ниже. Примечание. Пожалуйста, я динамически генерирую строку запроса и выполняю строку в конце. Вы можете заметить некоторые цитаты
ALTER PROCEDURE MyPROC
@phoneNo nvarchar(30) = null,
@status dbo.StatusViewTableType READONLY
AS
BEGIN
if(@option = 1)
begin
set @sql = 'SELECT c.id,c.name,c.NewIc,c.OldIc,c.Title,c.nationality,c.CreatedDate,c.companyNo,c.NonIc,c.Email
FROM customer c WITH (NOLOCK)
left outer join
dbo.Address with(nolock) on c.id = dbo.Address.CustomerID
left outer join dbo.ContactNo on c.id=dbo.ContactNo.CustomerID
WHERE (c.id > 0) and ('
if @oldIC <>'' and @phoneNo=''
set @sql = @sql + ' (oldic ='''+ @oldIC + ''' )or'
if @newIC <>'' and @phoneNo=''
set @sql = @sql + ' (newIC ='''+ @newIC + ''' )or'
if @companyno <>'' and @phoneNo=''
set @sql = @sql + ' (companyno ='''+ @companyno + ''' )or'
if @nonic <>'' and @phoneNo=''
set @sql = @sql + ' (nonic ='''+ @nonic + ''' )or'
If @phoneNo <>'' and @oldIC = '' and @newIC = '' and @companyno = '' and @nonic =''
begin
set @sql ='SELECT c.id,c.name,c.NewIc,c.OldIc,c.Title,c.nationality,c.CreatedDate,c.companyNo,c.NonIc,c.Email
FROM dbo.Customer WITH (NOLOCK) c INNER JOIN
dbo.ContactNo WITH (NOLOCK) ON c.id = dbo.ContactNo.CustomerID
where ContactNo = '''+ @phoneNo + ''' and dbo.ContactNo.Contactability in (SELECT s.status from ' + [@status] + ' AS s ) '
end
if @phoneNo=''
begin
set @sql = Left(@sql,Len(@sql)-2)
set @sql = @sql + ')'
set @sql = @sql + ' and ( dbo.Address.Contactable in (SELECT s.status from ' + [@status] + ' AS s) or dbo.ContactNo.Contactability in (SELECT s.status from ' + [@status] + ' AS s) )'
end
print @sql
exec (@sql)
end
КОНЕЦ
В моем внутреннем коде я передаю параметры, как показано ниже:
SqlConnection myConnection = null;
SqlCommand myCommand = null;
SqlDataReader myReader = null;
myConnection = new SqlConnection(connectionString);
myCommand = myConnection.CreateCommand();
myCommand.CommandText = "GETCUSTOMER";
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = 0;
SqlParameter parameter;
int l = ids.FirstOrDefault().Length;
if (ids.FirstOrDefault().Length > 0)
{
if (useDataTable)
{
parameter = myCommand.Parameters.AddWithValue("@status", CreateDataTable(ids));
}
else
{
parameter = myCommand.Parameters.AddWithValue("@status", CreateSqlDataRecords(ids));
}
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "dbo.StatusViewTableType";
}
myCommand.Parameters.Add(new SqlParameter("@phoneNo", SqlDbType.NVarChar));
myCommand.Parameters["@phoneNo"].Value = phoneNo;
У меня проблема с параметром @status
. Он не распознается в хранимой процедуре.
Выдает исключение:
Необходимо объявить скалярную переменную "@status".
Ниже мой StatusViewTAbleType
.
CREATE TYPE [dbo].[StatusViewTableType] AS TABLE(
[Status] [int] NOT NULL
)
GO
Любая помощь будет оценена по достоинству.