动态SQL的数据集中未显示列
我有以下SP,单独运行时可以正常工作:动态SQL的数据集中未显示列,sql,sql-server,sql-server-2008,dynamic-sql,Sql,Sql Server,Sql Server 2008,Dynamic 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.NetA
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
我遇到的问题是,当我为报表添加数据集时,它在fields部分中不提取任何字段/列。我猜这是因为动态SQL
我如何解决这个问题
正如statet在我的评论中所说,你应该避免使用动态方法 为了在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被拆分为一个列表。末尾的内部联接与您希望通过IN子句实现的完全相同
这种方法可以在表值函数中进行plcae,请确保将其保留为内联函数!。这个函数在任何地方都可以更好地重用
第二种推荐的方法是创建类型,但这需要在应用程序端执行更多操作…将exec@sql更改为exec@sql您的表是否有足够的数据?是的。有数据。在数据库级数据返回中运行SP时。与视图相比,存储的进程没有固定的列列表。SELECT语句不定义列。但不能从存储的进程中进行选择。您只能指定存储过程的参数,并查看它返回的内容。我会删除打印。。。愚蠢的问题:你确定你的向导对正确的数据库有效吗?还有一个问题:您确定在这种情况下,动态SQL是必需的选项吗?如果你只是需要一个解决方案,在。。。发票号码列表。。。有更好的方法。。。注意注射!