Столбцы не отображаются в DataSet для динамического SQL

У меня есть следующий SP, который работает правильно, когда запускается сам по себе:

ALTER PROCEDURE [dbo].[sgetInvoiceHeaderDetails]

@InvoiceNo varchar(max)
AS
BEGIN
SET FMTONLY ON;
    declare @sql varchar(max)

set @sql = 'SELECT IH.InvoiceNo, IH.InvoiceDate, IH.InvoiceTime, C.Name, R.Name AS Customer, IH.NetAmount, 
IM.Name AS Item, ID.UnitPrice, ID.Qty, ID.Total, ID.BatchNo
FROM InvoiceHeader AS IH INNER JOIN
InvoiceDetail AS ID ON IH.InvoiceNo = ID.InvoiceNo INNER JOIN
Customer AS C ON IH.CustomerId = C.Id INNER JOIN
Route AS R ON IH.RouteId = R.Id INNER JOIN
ItemMaster AS IM ON ID.ItemMasterId = IM.Id
WHERE IH.InvoiceNo IN ('+@InvoiceNo+')'
print @sql
exec (@sql)
END

У меня проблема в том, что когда я добавляю DataSet для отчета, он не тянет поля / столбцы в разделе Fields. Я предполагаю, что это из-за динамического SQL?

Как я могу решить это?

1 ответ

Как говорится в моем комментарии, вы должны избегать динамического подхода.

Просто чтобы предложить вам чистое встроенное решение в SQL, взгляните на это:

DECLARE @tbl TABLE(ID INT, Caption VARCHAR(100));
INSERT INTO @tbl VALUES(1,'Test 1'),(2,'Test 2'),(3,'Test 3'),(4,'Test 4'),(5,'Test 5');

DECLARE @WantToGet VARCHAR(100)='1,3,4';

WITH Splitted AS
(
    SELECT CAST('<x>' + REPLACE(@WantToGet,',','</x><x>') + '</x>' AS XML) AS AsXml
)
,SplittedAsList AS
(
    SELECT The.Node.value('.','int') As ID
    FROM Splitted
    CROSS APPLY AsXml.nodes('/x') AS The(Node)
)
SELECT Caption
FROM @tbl AS tbl
INNER JOIN SplittedAsList sal ON sal.ID = tbl.ID;

Строка 1,3,4 делится на список. INNER JOIN в конце концов, это то же самое, что вы хотели достичь с помощью предложения IN.

Этот подход можно использовать в табличной функции (убедитесь, что это встроенная функция!). Эту функцию намного лучше использовать везде.

Второй рекомендуемый подход будет CREATE TYPEНо это нужно больше действий на стороне приложения...

Другие вопросы по тегам