Mencoba menggunakan fungsi string_split SQL dalam kueri dinamis tetapi saya terus menerima kesalahan berikut. Nama kolom 'Deskripsi Faktur' tidak valid. Tipe data argumen tipe void tidak valid untuk ...

0
FirstElement 5 April 2021, 18:52

1 menjawab

Jawaban Terbaik

Tabel contoh dapat dibuat untuk menjalankan sql dinamis Anda.

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')

Sampel ini adalah tabel temp, jadi saya mengubah kode Anda untuk menunjuk ke tabel temp alih-alih yang asli, tetapi selain itu sama:

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;

Kode ini TIDAK error. Ini bukan kodenya. Ini adalah struktur tabel yang Anda tunjuk. Lihat tabel apa yang ditargetkan dalam klausa from Anda yang dicetak, dan lihat struktur tabelnya. Anda harus menemukan bahwa itu tidak memiliki kolom 'deskripsi faktur'.

Sekarang, ada lebih banyak masalah dengan kode Anda. Yaitu, Anda mencoba memompa data Anda ke '#temp' di dalam sql dinamis. Kode Anda tidak akan gagal, tetapi juga tidak akan berfungsi karena konteksnya berbeda antara kode di dalam sql dinamis dan kode di luarnya.

Anda ingin menggunakan tabel temp global (yaitu ##temp) atau menggunakan insert-exec. Di bawah ini adalah bagaimana Anda akan mengubah bagian terakhir dari kode Anda untuk melakukan yang terakhir:

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 = '';
1
pwilcox 5 April 2021, 16:11