我有一个表FicheArticle
,其中包含XML列ART_Fiche
。
我创建了一个存储过程,让我在该XML列中搜索:
DECLARE @statement nvarchar(max) = N'SELECT ART_UniqueID FROM FicheArticle
CROSS APPLY ART_Fiche.nodes('''+@XPath+''') as TT(c)'
execute sp_executesql @statement
当我在SQL Server上执行此操作时,我得到2个响应。首先是我想要的列表,第二个是“返回值”(我想这就是说执行是好还是不好)
我在我的Web应用程序中使用Linq + Entity Framework来调用这个
Dim a = LesDatas.GetArticleFiltred("//Product/ProductFeature[@CategoryFeature_ID=""6137"" and @Value=""DDR2""]")
我得到一个整数...我想要的是列表,而不是整数。
我读过的所有内容,我认为它在sp_executesql
上我不知道如何指定输出。所有样本都是1个整数(count(*),MAX ...)但是没有找到返回行,我没有到达以适应其他样本。
感谢您的帮助
我也试过
exec ('SELECT ART_UniqueID FROM SHOP_FicheArticle INNER JOIN SHOP_Article ON SHOP_FicheArticle.ART_IDIcecat = SHOP_Article.ART_IDIcecat CROSS APPLY ART_FicheIcecat.nodes('''+@XPath+''') as TT(c)')
在vb方面继续使用模型资源管理器 - >按钮获取列的信息但总是在响应中:没有列的回报
我尝试使用解决方案here来强制实体获得良好的回报
IF 1 = 2 BEGIN
SELECT
cast(null as nvarchar(500)) as SHOP_FicheArticle
WHERE
1 = 2
END
现在实体获得了良好的回报,但是当我执行时,它失败了:不同类型的回报......为什么我不那么惊讶...... 我发现EF和动态请求存在问题:here 我尝试强制在SQL端:SET FMTONLY OFF但同样的问题
数据阅读器与指定的'ExtranetModel.GetArticleFiltred_Result'不兼容。类型为“SHOP_FicheArticle”的成员在数据阅读器中没有相应的列具有相同的名称。
答案 0 :(得分:0)
我不知道这是否对您有所帮助,但您可能会将专用值传递给XPath。但是你无法传递XPath本身。
如果您处理不同的XPath表达式,则必须通过动态SQL,但如果您只想传递搜索值,则可以使用:
将变量@Test
设置为x或y,然后您将得到正确的行。
DECLARE @SomeTable TABLE(ID INT, SomeXML XML);
INSERT INTO @SomeTable VALUES
(1,'<root><a test="x">x</a></root>')
,(2,'<root><a test="y">y</a></root>');
DECLARE @Test VARCHAR(10)='y';
SELECT st.*
FROM @SomeTable AS st
CROSS APPLY st.SomeXML.nodes('/root/a[@test=sql:variable("@Test")]') AS A(B)
通过以下方式创建内联TVF非常容易:
CREATE TABLE SomeTable (ID INT, SomeXML XML);
INSERT INTO SomeTable VALUES
(1,'<root><a test="x">x</a></root>')
,(2,'<root><a test="y">y</a></root>');
GO
CREATE FUNCTION dbo.TestFunction(@Test VARCHAR(10))
RETURNS TABLE
AS
RETURN
SELECT st.*
FROM SomeTable AS st
CROSS APPLY st.SomeXML.nodes('/root/a[@test=sql:variable("@Test")]') AS A(B)
;
GO
SELECT * FROM dbo.TestFunction('y');
GO
DROP FUNCTION dbo.TestFunction;
DROP TABLE SomeTable;
答案 1 :(得分:0)
就像说Shnugo ...更新2是纠正的好答案
IF 1 = 2 BEGIN
SELECT
cast(null as nvarchar(112)) as ART_UniqueID
WHERE
1 = 2
END
...我也尝试成功:
创建新的存储过程谁先调用并使用beautifull声明@tbl ... 插入@tbl exec(FirstProc @Param) 从@tbl
中选择ART_UniqueID在一个存储过程中
DECLARE @tblAmount TABLE(ART_UniqueID NVARCHAR(112))
insert into @tblAmount
exec ('SELECT ART_UniqueID FROM SHOP_FicheArticle INNER JOIN SHOP_Article ON SHOP_FicheArticle.ART_IDIcecat = SHOP_Article.ART_IDIcecat CROSS APPLY ART_FicheIcecat.nodes('''+@XPath+''') as TT(c)')
SELECT * FROM @tblAmount
问题是它是完整的字符串请求,然后EF无法正确检测结构。
在这种情况下,我只返回一个字段
exec ('SELECT ART_UniqueID FROM SHOP_FicheArticle INNER JOIN SHOP_Article ON SHOP_FicheArticle.ART_IDIcecat = SHOP_Article.ART_IDIcecat CROSS APPLY ART_FicheIcecat.nodes('''+@XPath+''') as TT(c)')
在EF上:强制结果类型,如字符串标量。