sql-server
2017-05-23 4 views 0 likes 
0

Ich erhalte einen Fehler in meiner Exec Query wie "Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Wertes". Hier ist meine Abfrage.Table Valued Parameter zu where-Klausel von SQL Exec Query

DECLARE @sqlText nvarchar(max); 
SET @value = 'tblLedgerNames.ledger_code, tblLedgerNames.ledger_name'; --Its a sample values,Where '@value' based on listview of the form 
SET @sqlText = 'SELECT '[email protected]+' ,tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date 
       FROM tblLedgerNames RIGHT OUTER JOIN 
        tblSalesMaster ON tblLedgerNames.ledger_id = tblSalesMaster.account_id 
    where 
    sales_id <> 0' 
     + case when @Invoice_No is null then '' else ' and tblSalesMaster.invoice_no ='''[email protected]_No+'''' end 
     + case when (select count(*) from @List_Cstmr) < 1 then '' else 
      'and tblLedgerNames.ledger_id in (' + (select * from @List_Cstmr) + ') ' end --Where '@List_Cstmr' is an user-defined table types 

    +' GROUP BY '[email protected]+' ,tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date' 
    Exec (@sqlText) 

Antwort

0

Sie haben eine Reihe von Fehlern in Ihrem dynamischen SQL. Erstens dieser Fehler:

Conversion failed when converting the varchar value

wahrscheinlich durch Verketten @Invoice_No verursacht wird (was ich davon ausgehen, ist ein numerischer Typ) @sqlText, die von VARCHAR Typ ist. Darüber hinaus können Sie das Ergebnis eines SELECT * FROM <tbl> direkt zu einem varchar nicht verketten oder sonst werden Sie mit einem Fehler begrüßt werden:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Oder wenn die benutzerdefinierte Tabelle hat nur eine Zeile, und die von der Abfrage zu urteilen, es ist eine Liste von Ledger_IDs, von denen ich annehme, dass sie numerisch sind, was die Ursache für den vorherigen Fehler sein kann.

Wenn Sie es wirklich dynamische SQL verwenden tun müssen, können Sie sp_executesql verwenden und stattdessen Parameter übergeben:

DECLARE @sqlText NVARCHAR(MAX), 
     @value NVARCHAR(MAX); 

SELECT @value = 'tblLedgerNames.ledger_code, tblLedgerNames.ledger_name'; --Its a sample values,Where '@value' based on listview of the form 

SELECT @sqlText = 
'SELECT 
    ' + @value + ' ,tblSalesMaster.invoice_no, tblSalesMaster.tin_no, tblSalesMaster.entry_date 
FROM tblLedgerNames 
RIGHT OUTER JOIN tblSalesMaster ON 
    tblLedgerNames.ledger_id = tblSalesMaster.account_id 
WHERE 
    sales_id <> 0' + CHAR(10) 

IF @Invoice_No IS NOT NULL BEGIN 
    SELECT @sqlText = @sqlText + ' AND tblSalesMaster.invoice_no = @Invoice_No' + CHAR(10) 
END 

IF EXISTS(SELECT 1 FROM @List_Cstmr) BEGIN 
    SELECT @sqlText = @sqlText + ' AND tblLedgerNames.ledger_id IN (SELECT * FROM @List_Cstmr)' + CHAR(10) 
END 

SELECT @sqlText = @sqlText + 
'GROUP BY 
' + @value + ', tblSalesMaster.invoice_no, tblSalesMaster.tin_no, tblSalesMaster.entry_date'; 

EXEC sp_executesql 
    @sqlText, 
    N'@Invoice_No INT, @List_Cstmr UserDefinedTableType READONLY', 
    @Invoice_No, 
    @List_Cstmr 
+0

Ia m immer Fehler, wenn ich den obigen Code verwendet wird, der Fehler wie diese .Must die skalare Variable deklarieren „@Invoice_No“ .Must die Tabellenvariable „@List_Cstmr“ deklarieren. – jamshi

0

Inner wählen in where-Klausel eine temporäre Tabelle mit auch in einfache Anführungszeichen kommen sollte. Im inneren wählen Sie sollten eine einzelne Variable wählen nicht *

Dieser Code Versuchen:

DECLARE @sqlText nvarchar(max); 
SET @value = 'tblLedgerNames.ledger_code, tblLedgerNames.ledger_name'; --Its a sample values,Where '@value' based on listview of the form 
SET @sqlText = 'SELECT '[email protected]+' ,tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date 
       FROM tblLedgerNames RIGHT OUTER JOIN 
        tblSalesMaster ON tblLedgerNames.ledger_id = tblSalesMaster.account_id 
    where 
    sales_id <> 0' 
     + case when @Invoice_No is null then '' else ' and tblSalesMaster.invoice_no ='''[email protected]_No+'''' end 
     + case when (select count(*) from @List_Cstmr) < 1 then '' else 
      ' and tblLedgerNames.ledger_id in (select id from +' @List_Cstmr +') ' end --Where '@List_Cstmr' is an user-defined table types 
    +' GROUP BY '[email protected]+' , tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date' 
    Exec (@sqlText) 
+0

Ich habe es schon probiert, da wird auch ein Fehler angezeigt. – jamshi

+0

Bitte erwähnen Sie den Fehler, den Sie erhalten – Ravi

+0

Wir können diesen Code nicht ausführen, weil "@List_Cstmr" eine Tabelle ist. Der Fehler ist "muss skalare Variable @List_Cstmr ' – jamshi

0

Wo Wählen Sie Tabellentyp (@List_Cstmr) zu Temp Tabelle #temp, dann mit #temp in Where-Klausel ersetzen @List_Cstmr . Versuchen Sie diesen Code

DECLARE @sqlText nvarchar(max); 
SET @value = 'tblLedgerNames.ledger_code, tblLedgerNames.ledger_name'; --Its a sample values,Where '@value' based on listview of the form 
SET @sqlText = 'SELECT '[email protected]+' ,tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date 
      FROM tblLedgerNames RIGHT OUTER JOIN 
       tblSalesMaster ON tblLedgerNames.ledger_id = tblSalesMaster.account_id 
where 
sales_id <> 0' 
    + case when @Invoice_No is null then '' else ' and tblSalesMaster.invoice_no ='''[email protected]_No+'''' end 
    + case when (select count(*) from #temp) < 1 then '' else 
     ' and tblLedgerNames.ledger_id in (select id from #temp) ' end --Where '@List_Cstmr' is an user-defined table types 
+' GROUP BY '[email protected]+' , tblSalesMaster.invoice_no,tblSalesMaster.tin_no, tblSalesMaster.entry_date' 
Exec (@sqlText) 
Verwandte Themen