Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态SQL的数据集中未显示列_Sql_Sql Server_Sql Server 2008_Dynamic Sql - Fatal编程技术网

动态SQL的数据集中未显示列

动态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

我有以下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
我遇到的问题是,当我为报表添加数据集时,它在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是必需的选项吗?如果你只是需要一个解决方案,在。。。发票号码列表。。。有更好的方法。。。注意注射!