16 messaggi dal 05 ottobre 2004
Ultimamente ne ho una al giorno!!!

Dunque... All'interno della mia SP ho questa situazione:

ho la variabile @CodiciGepro che arriva così valorizzata: 'DIS01|DIS02'

Praticamente @CodiciGepro dovrebbe diventare 'DIS01','DIS02'. Di seguito il magro tentativo....

SELECT bla, bla ... where pr_codice in(rtrim(replace(@CodiciGepro, '|', ''',''')))

Che dire.... GRAZIE!!!!!!!!!!!!!

Steff
16 messaggi dal 05 ottobre 2004
diciamo che dopo un milione di tentativi la situazione è migliorata.. manca però ancora un'anticchia :)

declare @Apice char(5)
declare @ApiceSingolo char(2)
declare@CodiciGepro varchar(300)

set @Apice =''','''
set @ApiceSingolo = ''''
set @CodiciGepro = 'dis01|dis02'

SET @CodiciGepro = replace(rtrim(@CodiciGepro),'|',''',''')
set @CodiciGepro = rtrim(@ApiceSingolo) + rtrim(@CodiciGepro) + rtrim(@ApiceSingolo)

Dopo tutte queste lugubrazioni mi ritrovo la mia variabile correttamente impostata nel modo seguente :
@CodiciGepro = 'dis01', 'dis02'

PERO' .. quando vado ad eseguire la query(Select * from si_progetto where pr_codice in (@CodiciGepro) ... non mi restituisce NULLA!!!

Manca ancora qualcosa .... qualche idea?????


Grazie anticipate!!!!

Steff
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
stefborg wrote:
diciamo che dopo un milione di tentativi la situazione è migliorata.. manca però ancora un'anticchia
declare @Apice char(5)
declare @ApiceSingolo char(2)
declare @CodiciGepro varchar(300)
set @Apice =''','''
set @ApiceSingolo = ''''
set @CodiciGepro = 'dis01|dis02'
SET @CodiciGepro = replace(rtrim(@CodiciGepro),'|',''',''') set @CodiciGepro = rtrim(@ApiceSingolo) + rtrim(@CodiciGepro) + rtrim(@ApiceSingolo)
Dopo tutte queste lugubrazioni mi ritrovo la mia variabile
correttamente impostata nel modo seguente :
* @CodiciGepro = 'dis01', 'dis02' *
PERO' .. quando vado ad eseguire la query(Select * from si_progetto where pr_codice in (@CodiciGepro) ... non mi restituisce NULLA!!! * Manca ancora qualcosa .... qualche idea????? *
Grazie anticipate!!!!

a dire il vero dovrebbe restituirti un errore, nel senso che non puoi utilizzare una "variabile" al posto di un set di dati.. il costrutto IN/NOT IN si aspetta infatti un "insieme", e non una "stringa con al suo interno dei riferimenti" piu' o meno esemplificativi.. devi infatti in effetti considerarlo come un'operazione di join, estesa come "eccezione" (except per il NOT IN) o "insieme" vero e proprio per l'IN... quindi devi tramutare il tuo parametro "stringa" contenente l'elenco di riferimenti in un set vero e proprio.. devi quindi procedere diversamente, ad esempio similarmente a SET NOCOUNT ON;
USE tempdb;
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[ufn_Split2IdTable] (
@IdSTR varchar(8000)
)
RETURNS @IdString2Table TABLE
(
Id int NOT NULL
)
AS
BEGIN


occhio che la tabella ritornata deve contenere

almeno 1 riga, eventualmente "impossibile"
INSERT INTO @IdString2Table VALUES (-1);
DECLARE @pos int = 0
DECLARE @elem varchar(10) = ''
WHILE LEN(@IdSTR) > 0 BEGIN
SELECT @pos = CHARINDEX(',', @IdSTR)
IF @pos <> 0 BEGIN
SELECT @elem = LTRIM(REPLACE(LEFT(@IdSTR, @pos),',', '')); IF LEN(@elem) > 0 INSERT INTO @IdString2Table SELECT CONVERT( int, @elem);
SELECT @IdSTR = SUBSTRING(@IdSTR, @pos +1, LEN(@IdSTR) - @pos +1 ); END;
ELSE BEGIN
IF LEN(@IdSTR) > 0 INSERT INTO @IdString2Table SELECT
CAST(REPLACE(@IdSTR,',', '') AS int);
SELECT @IdSTR = '';
END;
END;

RETURN;
END;
GO
CREATE TABLE dbo.t (
Id int NOT NULL
);
GO
INSERT INTO dbo.t VALUES (1);
INSERT INTO dbo.t VALUES (2);
INSERT INTO dbo.t VALUES (3);
INSERT INTO dbo.t VALUES (4);
INSERT INTO dbo.t VALUES (5);
INSERT INTO dbo.t VALUES (6);
INSERT INTO dbo.t VALUES (7);
INSERT INTO dbo.t VALUES ( ;
INSERT INTO dbo.t VALUES (9);
INSERT INTO dbo.t VALUES (10);
GO
DECLARE @var varchar(1000);
SET @var = '1,3,5,7,9';
DECLARE @tNotIn TABLE ( Id int );
INSERT INTO @tNotIn
SELECT Id
FROM [dbo].[ufn_Split2IdTable](@var);

SELECT *
FROM @tNotIn;

SELECT *
FROM dbo.t
WHERE t.Id NOT IN (
SELECT * FROM @tNotIn
);

PRINT 'oppure';
SELECT *
FROM dbo.t
WHERE t.Id NOT IN (
SELECT * FROM [dbo].[ufn_Split2IdTable](@var)
);

PRINT 'Oppure'
SELECT *
FROM dbo.t
LEFT JOIN [dbo].[ufn_Split2IdTable](@var) x
ON x.Id = t.Id
WHERE x.Id IS NULL;

PRINT 'Oppure ancora'
SELECT *
FROM dbo.t
EXCEPT
SELECT *
FROM [dbo].[ufn_Split2IdTable](@var) x;

GO

DROP FUNCTION [dbo].[ufn_Split2IdTable];
DROP TABLE dbo.t;


dove vedi riassunta completamente la sinopsi retrostante l'operazione stessa, con l'esemplificazione dell'estensione di azione nelle operazioni di join e di esclusione..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.