如何消除此SQL字符串\u分割函数错误
尝试在动态查询中使用SQL字符串分割函数,但我仍然收到以下错误。 列名称“发票说明”无效。 参数数据类型void type对于string_split函数的参数1无效。 我搞不懂这个问题。非常感谢您的帮助如何消除此SQL字符串\u分割函数错误,sql,sql-server,Sql,Sql Server,尝试在动态查询中使用SQL字符串分割函数,但我仍然收到以下错误。 列名称“发票说明”无效。 参数数据类型void type对于string_split函数的参数1无效。 我搞不懂这个问题。非常感谢您的帮助 DECLARE @AuthFile nvarchar(max); DECLARE @TableName AS SYSNAME; DECLARE @sql nvarchar(max); SET @TableName = '__tTransactions_' + REPLACE(CONVERT(
DECLARE @AuthFile nvarchar(max); DECLARE @TableName AS SYSNAME;
DECLARE @sql nvarchar(max);
SET @TableName = '__tTransactions_' + REPLACE(CONVERT(CHAR(10), GETDATE(), 103), '/', '');
SET @AuthFile = '__Authorization';
create table #temp (TransactionID nvarchar(1000), CartID int, TotalAmount nvarchar(1000))
SET @sql = 'select [Transaction ID] as TransactionID, cs.value as CartID, [Total Amount] as TotalAmount
into #temp
from ' + @TableName + '
cross apply string_split([Invoice Description], ''|'') cs
where (isnull([Invoice Description], '''') <> '''')';
print(@sql);
EXEC(@sql);
SET @sql = '';
select * from #temp
drop table #temp
可以创建一个示例表来运行动态sql
drop table if exists #__tTransactions_05042021;
create table #__tTransactions_05042021 (
[Transaction ID] int,
[Total Amount] float,
[Invoice Description] varchar(255)
);
insert #__tTransactions_05042021 values
(1, 100, '1|2|3'),
(2, 200, '4|5|6')
此示例是一个临时表,因此我将您的代码更改为指向临时表,而不是实际的临时表,但在其他方面都是相同的:
DECLARE @AuthFile nvarchar(max);
DECLARE @TableName AS SYSNAME;
DECLARE @sql nvarchar(max);
SET @TableName = '#__tTransactions_' + REPLACE(CONVERT(CHAR(10), GETDATE(), 103), '/', '');
SET @AuthFile = '__Authorization';
create table #temp (TransactionID nvarchar(1000), CartID int, TotalAmount nvarchar(1000))
SET @sql = 'select [Transaction ID] as TransactionID, cs.value as CartID, [Total Amount] as TotalAmount
into #temp
from ' + @TableName + '
cross apply string_split([Invoice Description], ''|'') cs
where (isnull([Invoice Description], '''') <> '''')';
print(@sql);
EXEC(@sql);
SET @sql = '';
select * from #temp
drop table #temp;
此代码不会出错。这不是密码。这是你指的桌子的结构。查看打印出来的from子句中的目标表,并查看表结构。您应该发现它没有“发票说明”列
现在,您的代码有更多的问题。也就是说,您正试图将数据注入动态sql中的“temp”中。您的代码不会失败,但也不会工作,因为动态sql内部代码和外部代码的上下文不同
您需要使用全局临时表,即temp或insert exec。下面是如何更改代码的最后一部分以执行后一部分:
create table #temp (TransactionID nvarchar(1000), CartID int, TotalAmount nvarchar(1000))
SET @sql = 'select [Transaction ID] as TransactionID, cs.value as CartID, [Total Amount] as TotalAmount
from ' + @TableName + '
cross apply string_split([Invoice Description], ''|'') cs
where (isnull([Invoice Description], '''') <> '''')';
print(@sql);
insert #temp
EXEC(@sql);
SET @sql = '';
我建议您提供示例数据、期望的结果,并清楚地解释代码应该做什么。字符串拆分在某些数据类型上不起作用,因此您必须将数据类型转换为它可以使用的类型。我假设您使用的是varcharmax或其他数据类型,有时被视为一个blob。让我们知道该数据类型是什么,以及是否强制转换为varhcar8000为您修复了它。如果我将此查询从变量中取出,并不是作为动态查询运行,则它工作正常。void类型听起来有点奇怪。不知道为什么它没有说实际的数据类型。如果uuu tTransactions_0504021根本不包含列Invoice Description,您会看到这一点,但同时也会出现无效列名称“Invoice Description”的其他错误,在任何情况下,您都不希望在此处使用SELECT…,因为这将在动态SQL的作用域中创建一个新的临时表,并且该表将尽快销毁出口