webForumDet fria alternativet

SP struntar i min sortering

Databaser & SQLur Databashanterare & SQL

1 svar · 300 visningar · startad av Pedda

Medlem sedan juni 20006 031 inlägg
Frågan#1

Håller på med en stored procedure men den verkar strunta i att jag i min SELECT har WHERE s.to_status = ''FASTSTÄLLD''.
Resultat ger även dom fält som har annat värde än FASTSTÄLLD.

Kort version:

....
FROM propdb_current_s s
LEFT OUTER JOIN frej_import f ON s.to_fbet = f.to_fbet
LEFT OUTER JOIN propdb_current_r r ON s.a_webc_url = r.a_webc_url
WHERE s.to_status = ''FASTSTÄLLD''  
AND s.r_object_type = ''to_document''
AND NOT s.r_current_state = 0 
... osv

Lång version för er som orkar läsa hela sp'n:

ALTER      PROCEDURE usp_DVD_DitoDocCDTO
	@to_grupp varchar(16),
	@to_mtrl varchar(40),
	@to_typ varchar(8),
	@to_versioner varchar(40),
	@to_kod varchar(32)
AS
CREATE TABLE #TempDocTable 
(
a_webc_url nvarchar(450),
a_content_type nvarchar(32),
to_giltig datetime,
to_klass nvarchar(1),
object_name nvarchar(255),
r_content_size int,
r_folder_path nvarchar(765),
to_sakbyra nvarchar (40),
to_sakhandl nvarchar (64),
to_fben nvarchar(255),
to_fbet nvarchar(12),
to_typ nvarchar(8),
to_mtrl nvarchar(40),
to_grupp nvarchar(16),
to_lopnr nvarchar(6),
to_order int,
to_status nvarchar(12),
to_sid nvarchar(4),
to_utg nvarchar(2),
to_avisering datetime,
to_upphavd datetime,
to_faststalld datetime,
r_current_state int,
to_arendemening nvarchar(500),
to_tillh nvarchar(500),
to_versioner nvarchar(500),
to_kod nvarchar(32),
to_upphavd_orsak nvarchar(128)
)
DECLARE @SQL varchar(8000)
SET @SQL = 'SELECT DISTINCT 
rtrim(s.a_webc_url),
rtrim(s.a_content_type),
s.to_giltig,
s.to_klass,
rtrim(s.object_name),
s.r_content_size,
rtrim(s.r_folder_path),
s.to_sakbyra,
s.to_sakhandl,
f.to_fben,
s.to_fbet,
s.to_typ,
s.to_mtrl,
s.to_grupp,
s.to_lopnr,
s.to_order,
rtrim(s.to_status),
s.to_sid,
s.to_utg,
s.to_avisering,
s.to_upphavd,
s.to_faststalld,
s.r_current_state,
'''' AS to_arendemening,
'''' AS to_tillh,
'''' AS to_versioner,
s.to_kod,
s.to_upphavd_orsak
FROM propdb_current_s s
LEFT OUTER JOIN frej_import f ON s.to_fbet = f.to_fbet
LEFT OUTER JOIN propdb_current_r r ON s.a_webc_url = r.a_webc_url
WHERE s.to_status = ''FASTSTÄLLD''  
AND s.r_object_type = ''to_document''
AND NOT s.r_current_state = 0 
AND NOT s.object_name = ''DUMMY'' AND (
rtrim(s.to_grupp) LIKE ''' + @to_grupp + ''' AND 
rtrim(s.to_mtrl) LIKE ''' + @to_mtrl + ''' AND 
rtrim(s.to_typ) LIKE ''' + @to_typ + ''''
IF NOT @to_versioner = '%'
BEGIN
	SET @SQL = @SQL + ' AND r.to_versioner LIKE ''' + @to_versioner + ''')'
END
ELSE
BEGIN
	SET @SQL = @SQL + ')'
END
IF NOT @to_kod = '' AND NOT @to_kod IS NULL
BEGIN
	SET @SQL = @SQL + ' OR s.to_kod = ''' + @to_kod + ''''
END
PRINT @SQL
INSERT INTO #TempDocTable
EXEC (@SQL)
DECLARE object_s_cur CURSOR FOR
SELECT a_webc_url FROM #TempDocTable
OPEN object_s_cur
DECLARE
	@a_webc_url_s varchar(544),
	@tempArendemening varchar(500),
	@tempTillh varchar(500),
	@tempVersioner varchar(500)
FETCH NEXT FROM object_s_cur INTO @a_webc_url_s
WHILE @@FETCH_STATUS = 0
BEGIN
	DECLARE object_r_cur CURSOR FOR
	SELECT to_arendemening, to_tillh, to_versioner
	FROM propdb_current_r
	WHERE a_webc_url = @a_webc_url_s
	OPEN object_r_cur
	DECLARE
	@to_arendemening_r varchar(80),
	@to_tillh_r varchar(24),
	@to_versioner_r varchar(40)
	FETCH NEXT FROM object_r_cur INTO @to_arendemening_r, @to_tillh_r, @to_versioner_r
	SET @tempArendemening = ''
	SET @tempTillh = ''
	SET @tempVersioner = ''
	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF NOT @to_arendemening_r IS NULL AND NOT RTRIM(@to_arendemening_r) = ''
		BEGIN
			SET @tempArendemening = @tempArendemening + LTRIM( RTRIM( @to_arendemening_r ) ) + ', '
		END		
		IF NOT @to_tillh_r IS NULL AND NOT RTRIM(@to_tillh_r) = ''
		BEGIN
			SET @tempTillh = @tempTillh + LTRIM( RTRIM( @to_tillh_r ) ) + ', '
		END		
		IF NOT @to_versioner_r IS NULL AND NOT RTRIM(@to_versioner_r) = ''
		BEGIN
			SET @tempVersioner = @tempVersioner + LTRIM( RTRIM( @to_versioner_r ) ) + ', '
		END		
	
		FETCH NEXT FROM object_r_cur INTO @to_arendemening_r, @to_tillh_r, @to_versioner_r
	END
	IF @tempArendemening <> ''
		SET @tempArendemening = Substring( @tempArendemening, 1, LEN( @tempArendemening ) - 1 )
	IF @tempTillh <> ''
		SET @tempTillh = Substring( @tempTillh, 1, LEN( @tempTillh ) - 1 )
	IF @tempVersioner <> ''
		SET @tempVersioner = Substring( @tempVersioner, 1, LEN( @tempVersioner ) - 1 )
	UPDATE #TempDocTable SET 
		to_arendemening = @tempArendemening, 
		to_tillh = @tempTillh, 

		to_versioner = @tempVersioner
	WHERE a_webc_url = RTRIM( @a_webc_url_s )
	CLOSE object_r_cur
	DEALLOCATE object_r_cur
	FETCH NEXT FROM object_s_cur INTO @a_webc_url_s
END
CLOSE object_s_cur
DEALLOCATE object_s_cur
SELECT DISTINCT * FROM #TempDocTable
DROP TABLE #TempDocTable
Medlem sedan juni 200032 967 inlägg
#2

Min gissning är att probblemet är något sånt härnt:

BEGIN
	SET @SQL = @SQL + ' OR s.to_kod = ''' + @to_kod + ''''
END

Med det tillägget räcker det ju att s.to_kod har ett visst värde.

Om du skriver ut den färdiga sql-frågan som porceduren genererar (typ print @SQL) så ser du säkert om du har något OR som inte parentesmässigt hänger ihop med rätt villkor.

139 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)