Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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字符串\u分割函数错误_Sql_Sql Server - Fatal编程技术网

如何消除此SQL字符串\u分割函数错误

如何消除此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(

尝试在动态查询中使用SQL字符串分割函数,但我仍然收到以下错误。 列名称“发票说明”无效。 参数数据类型void type对于string_split函数的参数1无效。 我搞不懂这个问题。非常感谢您的帮助

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的作用域中创建一个新的临时表,并且该表将尽快销毁出口