[更新的问题描述]我们有一个批量导入过程,我们将其IEnumerable<SqlDataRecord>作为表值参数(TVP)传递给存储过程,因为DataTable类型直到EF Core 1.1才可用。我们刚刚将项目升级为使用.Net Core 2.0,并开始更新代码以使用DataTable。该ExecuteSqlCommandAsync命令开始抛出InvalidCastException。以下是异常详细信息:
System.InvalidCastException occurred
HResult=0x80004002
Message=Failed to convert parameter value from a DataTable to a IEnumerable`1.
Source=<Cannot evaluate the exception source>
StackTrace:
at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
at System.Data.SqlClient.SqlParameter.GetCoercedValue()
at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters)
at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC& rpc)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, …Run Code Online (Sandbox Code Playgroud) c# entity-framework table-valued-parameters entity-framework-core
我正在尝试调用一个存储过程,该过程接受一个带有一个字符串和一个日期时间列的表值参数。
存储过程
ALTER PROCEDURE [dbo].[uspStoredProcedureDateTimeTableValueTest]
-- Add the parameters for the stored procedure here
@Param DateTimeType READONLY
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
END
Run Code Online (Sandbox Code Playgroud)
电视节目:
CREATE TYPE DateTimeType AS TABLE
(
Name nvarchar(50),
ModifiedDate datetime
)
Run Code Online (Sandbox Code Playgroud)
.NET 控制台应用程序:
static void Main(string[] args)
{
string connectionString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
DataTable table = new DataTable("Test");
table.Columns.Add("ModifiedDate", typeof(DateTime));
table.Columns.Add("Name", typeof(string));
DataRow …Run Code Online (Sandbox Code Playgroud) 我试图将外部应用放在表变量上,但我收到如下错误
无法在表上调用方法.
我有Split功能,将字符串拆分为一定长度
CREATE FUNCTION Split(@String varchar(MAX), @SplitLength int)
RETURNS @Result TABLE (Splited varchar(MAX))
AS
BEGIN
Declare @Cnt int
Set @Cnt = FLOOR((len(@String)/@SplitLength));
While @Cnt!=0
Begin
SET @Cnt=@Cnt-1;
While len(@String)>@SplitLength
Begin
INSERT INTO @Result VALUES (SUBSTRING(@String,1,@SplitLength))
SET @String=SUBSTRING(@String,@SplitLength+1,len(@String)-@SplitLength)
End
End
RETURN
END
Run Code Online (Sandbox Code Playgroud)
我与表变量连接,其中包含要分割字符串的列
DECLARE @LeftSuper TABLE
(
KeyTerm VARCHAR(MAX),
Data VARCHAR(MAX) ,
)
Run Code Online (Sandbox Code Playgroud)
查询如下,哪个生成错误(无法调用表上的方法)
select KeyTerm ,D.Splited from @LeftSuper
outer apply [Split](@LeftSuper.Data,300) as D
Run Code Online (Sandbox Code Playgroud)
注意:代码适用于db中的Real Table.
我正在尝试创建一个存储过程,将 TVP 传递给该过程,然后将 TVP 中的一些数据插入到两个表中。
我已经实现了存储过程,但只有第二个插入(唯一不从 TVP 读取的)在工作。另外两个不起作用(不要插入任何东西),我似乎无法弄清楚原因。
我试图在 SQL Server 中创建一个虚拟 TVP 并在那里运行该过程,但这也不起作用。这是因为 TVP 是只读的吗?我不会假设,因为我实际上并没有在 TVP 中插入或更新数据。
有没有办法使这项工作?
谢谢您的帮助!
表值参数定义:
CREATE TYPE dbo.Ingredients
AS TABLE
(
Quantity int,
Measure nvarchar(50),
Ingredient nvarchar(50),
)
GO
Run Code Online (Sandbox Code Playgroud)
存储过程:
ALTER PROCEDURE uspCreateRecipe
(@IDUser int,
@RecipeName nvarchar(50),
@Category nvarchar(50),
@Difficulty nvarchar(50),
@Duration nvarchar(50),
@ING dbo.Ingredients READONLY,
@Execution text)
AS
BEGIN
INSERT INTO dbo.Ingredients
VALUES ((SELECT Ingredient FROM @ING WHERE NOT EXISTS (SELECT Ingredient FROM @ING WHERE Ingredient IN (SELECT IngredientName FROM dbo.Ingredients))), 2)
INSERT …Run Code Online (Sandbox Code Playgroud) sql t-sql sql-server stored-procedures table-valued-parameters
我创建了表值参数,如下所示:
CREATE TYPE dbo.ss AS TABLE(ss1 NVARCHAR(5));
Run Code Online (Sandbox Code Playgroud)
然后我写了这样的存储过程:
ALTER PROCEDURE [dbo].[T_TransactionSummary]
@locations dbo.ss readonly
as
begin
...............
.............
AND (Location_tbl.Locid IN (@locations))
Run Code Online (Sandbox Code Playgroud)
执行此操作时我收到错误:
必须声明标量变量"@locations".
我的存储过程有什么问题