Prefaggerò questo facendoti sapere che mi sono ripromesso alcuni anni fa di non utilizzare mai un cursore in SQL dove non è necessario. Purtroppo penso che potrei doverne usare uno nella mia situazione attuale ma è passato così tanto tempo che non riesco a ricordare la sintassi corretta.Cursore SQL per utilizzare i nomi di tabella e di campo dalla tabella temporanea
Fondamentalmente, ho un problema con CONVERT_IMPLICIT
che si verifica nelle query perché ho tipi di dati diversi per lo stesso campo in tabelle diverse, quindi mi piacerebbe alla fine convertirli in int
. Ma per fare questo ho bisogno di verificare se tutti i dati possono essere convertiti in int o meno per vedere quanto è grande il lavoro.
Ho la seguente query che mi fornisce un elenco di tutte le tabelle nel database che contengono il campo pertinente in un elenco;
IF OBJECT_ID('tempdb..#BaseData') IS NOT NULL DROP TABLE #BaseData
GO
CREATE TABLE #BaseData (Table_Name varchar(100), Field_Name varchar(100), Data_Type_Desc varchar(20), Data_Max_Length int, Convertible bit)
DECLARE @FieldName varchar(20); SET @FieldName = 'TestFieldName'
INSERT INTO #BaseData (Table_Name, Field_Name, Data_Type_Desc, Data_Max_Length)
SELECT
o.name ,c.name ,t.name ,t.max_length
FROM sys.columns c
JOIN sys.types t
ON c.user_type_id = t.user_type_id
JOIN sys.objects o
ON c.object_id = o.object_id
WHERE c.name LIKE '%' + @FieldName + '%'
AND o.type_desc = 'USER_TABLE'
Quale dà risultati come questo;
Table_Name Field_Name Data_Type_Desc Data_Max_Length Convertible
Table1 TestFieldName varchar 8000 NULL
Table2 TestFieldName nvarchar 8000 NULL
Table3 TestFieldName int 4 NULL
Table4 TestFieldName varchar 8000 NULL
Table5 TestFieldName varchar 8000 NULL
Quello che mi piacerebbe fare è quello di verificare se tutti i dati del relativo campo della tabella & possono essere convertiti in un int e aggiornare il campo 'convertibile' (1 se ci sono dati che non possono essere convertiti , 0 se i dati vanno bene). Ho il seguente calcolo che funziona perfettamente;
'SELECT
CASE
WHEN COUNT(' + @FieldName + ') - SUM(ISNUMERIC(' + @FieldName + ')) > 0
THEN 1
ELSE 0
END
FROM ' + @TableName
E dà il risultato che sto cercando. Ma sto lottando per ottenere la sintassi corretta per creare il cursore che guarderà ogni riga nella mia tabella temporanea ed eseguirà questo SQL di conseguenza. È quindi necessario aggiornare la colonna finale della tabella temporanea con il risultato della query (1 o 0).
Questo dovrà essere eseguito su un paio di centinaia di database, motivo per cui ho bisogno che questa lista sia dinamica, potrebbero esserci tabelle personalizzate in alcuni database (in effetti, è piuttosto probabile).
Se qualcuno potesse fornire una guida, sarebbe molto apprezzato.
Grazie
Non proprio parte della risposta, ma sembrava che la tua definizione di Convertibile e la tua query per definire convertibili fossero forse in disaccordo tra loro e usando la tua query la colonna finale potrebbe essere chiamata Non Convertibile ... – SMM
Sei un vero santo . Sì, ora la logica è qui su cui posso giocare e andare al prossimo passo con questo. Apprezzato, grazie. Devo aspettare fino a domani prima di assegnare la taglia. –