2015-02-22 2 views
0

Эта моя хранимая процедура и параметры, но мне нужно сделать динамический поискSQL Server присоединиться хранимая процедура

SELECT 
    dbo.Invoices.*, 
    dbo.Vessels.Name AS VesselName, 
    dbo.Companies.Name AS CompanyName, 
    dbo.InvoiceTypes.Name AS InvoiceTypeName, 
    dbo.InvoiceItems.Name AS InvoiceItemName, 
    dbo.InvoiceItems.InvoiceItemID 
FROM    
    dbo.Invoices 
    LEFT JOIN dbo.Vessels ON 
    dbo.Invoices.VesselID = dbo.Vessels.VesselID 
    INNER JOIN dbo.Companies ON 
    dbo.Invoices.CompanyID = dbo.Companies.CompanyID 
    LEFT JOIN dbo.InvoiceTypes ON 
    dbo.Invoices.InvoiceTypeID = dbo.InvoiceTypes.InvoiceTypeID 
    LEFT JOIN dbo.InvoiceVsInvoiceItems ON 
    dbo.Invoices.InvoiceID = dbo.InvoiceVsInvoiceItems.InvoiceID 
    LEFT JOIN dbo.InvoiceItems ON 
    dbo.InvoiceVsInvoiceItems.InvoiceItemID = dbo.InvoiceItems.InvoiceItemID 

ПАРАМЕТРЫ

@InvoiceItemID int, 
@InvoiceTypeID int, 
@VesselID int, 
@PaidByID int, 
@InvoiceNo NVarchar(50), 
@CompanyID int, 
@chkSearchInvoiceDate bit, 
@chkSearchIsDueDate bit, 
@chkSearchIsPaid bit, 
@chkSearchReceived bit, 
@chkSearchAmount bit, 
@chkSearchInvoiceType bit, 
@InvoiceFromDate DateTime, 
@InvoiceToDate DateTime, 
@FromDueDate DateTime, 
@ToDueDate  DateTime, 
@FromAmount decimal(18,4), 
@ToAmount decimal(18,4)  

Но я попробовал это то, что я делаю, когда Есть несколько где? Я не мог :(

Спасибо

Declare @SQLQuery AS NVarchar(4000) 
Declare @ParamDefinition AS NVarchar(2000)  
Set @SQLQuery = 'SELECT dbo.Invoices.*, dbo.Vessels.Name AS VesselName, dbo.Companies.Name AS CompanyName, dbo.InvoiceTypes.Name AS InvoiceTypeName, 
       dbo.InvoiceItems.Name AS InvoiceItemName, dbo.InvoiceItems.InvoiceItemID' 

If @InvoiceItemID Is Not Null 
    Set @SQLQuery = @SQLQuery + 'FROM dbo.Invoices LEFT JOIN dbo.InvoiceItems ON dbo.InvoiceVsInvoiceItems.InvoiceItemID = dbo.InvoiceItems.InvoiceItemID WHERE dbo.InvoiceVsInvoiceItems.InvoiceItemID = @InvoiceItemID' 

If @VesselID Is Not Null 
    Set @SQLQuery = @SQLQuery + 'LEFT JOIN dbo.Vessels ON dbo.Vessels.VesselID = dbo.Invoices.VesselID WHERE dbo.Invoices.VesselID = @VesselID' 

If @InvoiceNo Is Not Null 
    Set @SQLQuery = @SQLQuery + 'WHERE dbo.Invoices.InvoiceNo = @InvoiceNo' 

If @CompanyID Is Not Null 
    Set @SQLQuery = @SQLQuery + 'WHERE dbo.Invoices.CompanyID = @CompanyID' 

If @chkSearchInvoiceDate > 0 
    Set @SQLQuery = @SQLQuery + 'WHERE Between @InvoiceFromDate and @InvoiceToDate' 

If @chkSearchIsDueDate > 0 
    Set @SQLQuery = @SQLQuery + 'WHERE Between @FromDueDate and @ToDueDate' 

If @chkSearchIsPaid > 0 
    Set @SQLQuery = @SQLQuery + 'WHERE dbo.Invoices.PaidBy = @PaidBy' 

If @chkSearchReceived > 0 
     Set @SQLQuery = @SQLQuery + 'WHERE dbo.Invoices.InvoiceNo = @InvoiceNo' 

ответ

1

Если вы хотите, чтобы иметь возможность использовать несколько параметров в предложении where в то же время вы можете добавить их как это:

Declare @SQLQuery AS NVarchar(4000) 
Declare @ParamDefinition AS NVarchar(2000)  
Set @SQLQuery = ' 
SELECT 
    dbo.Invoices.*, 
    dbo.Vessels.Name AS VesselName, 
    dbo.Companies.Name AS CompanyName, 
    dbo.InvoiceTypes.Name AS InvoiceTypeName, 
    dbo.InvoiceItems.Name AS InvoiceItemName, 
    dbo.InvoiceItems.InvoiceItemID 
FROM dbo.Invoices 
LEFT JOIN dbo.InvoiceItems ON dbo.InvoiceVsInvoiceItems.InvoiceItemID = dbo.InvoiceItems.InvoiceItemID 
LEFT JOIN dbo.Vessels ON dbo.Vessels.VesselID = dbo.Invoices.VesselID 
WHERE 1=1 ' 

If @InvoiceItemID Is Not Null 
    Set @SQLQuery = @SQLQuery + ' AND dbo.InvoiceVsInvoiceItems.InvoiceItemID = @InvoiceItemID' 

If @VesselID Is Not Null 
    Set @SQLQuery = @SQLQuery + ' AND dbo.Invoices.VesselID = @VesselID' 

If @InvoiceNo Is Not Null 
    Set @SQLQuery = @SQLQuery + ' AND dbo.Invoices.InvoiceNo = @InvoiceNo' 

If @CompanyID Is Not Null 
    Set @SQLQuery = @SQLQuery + ' AND dbo.Invoices.CompanyID = @CompanyID' 

If @chkSearchInvoiceDate > 0 
    Set @SQLQuery = @SQLQuery + ' AND InvoiceDate Between @InvoiceFromDate and @InvoiceTODate' 

If @chkSearchIsDueDate > 0 
    Set @SQLQuery = @SQLQuery + ' AND IsDueDate Between @FromDueDate and @ToDueDate' 

If @chkSearchIsPaid > 0 
    Set @SQLQuery = @SQLQuery + ' AND dbo.Invoices.PaidBy = @PaidByID' 

If @chkSearchReceived > 0 
    Set @SQLQuery = @SQLQuery + ' AND dbo.Invoices.InvoiceNo = @InvoiceNo' 
+0

ли отличное от @VesselID действительно нужно? –

+0

@JamesZ Я думаю, что нужно уметь конкатрировать строку и целое число. То же самое можно сказать о всех других параметрах, которые были введены. – jpw

+0

Я неправильно понял или вы отредактировали это ... Я думаю, что переменные должны быть в SQL текст вместо значений и значений, заданных отдельно для sp_execute_sql? –

Смежные вопросы