webForumDet fria alternativet

T-SQL Hjälp.

2 svar · 414 visningar · startad av Zaphod

ZaphodMedlem sedan maj 2000107 inlägg
#1

Så har jag nu då försökt mig på att göra en stored procedure. Och det funkar fint. Det är väl bara det att jag funderar på ifall man inte skulle kunna lösa det på ett mycket smidigare sätt.

Har lite problem att förstå mig på syntaxen. När man, tex, använder IF (som ju går att göra) så deklarerar man inget slut. Utan If satsen slutar typ när man har gjort ett action command eller liknande. Beror det på SQL:s uppbyggnad eller är det bara jag som gör fel.
Vad Begin ska vara bra för vet jag inte heller, eftersom det verkar funka utan det.

Nog pladdrat. Koden är till ett forum och ser ut såhär:

CREATE PROCEDURE AddNewPost 
	@UID		varChar(15), 	--User ID
	@PWD		varChar(10), 	--Password
	@Topic		varChar(30),	--Message Topic
	@Body		varChar(2000),	--Message Body Text, 2000 chars
	@MsgRef		int,		--Message Reference
	@GroupRef	int,		--Group Reference
	@MsgLevel	int		--Message Level
AS
BEGIN
	DECLARE 	@PostAdded	Int	--Return value
	DECLARE 	@PostDate	dateTime
	DECLARE		@UserID		int
	
	---See if username and password are corre with the same name exists
	IF EXISTS(SELECT ID
		FROM		Users
		WHERE		UID = @UID	 --Check User ID
		AND		PWD = @PWD)  --Check Password
	
		SELECT @PostAdded = 1, -- If user exists return true
			@PostDate = GetDate(), --Set Current Date
			@UserID = (SELECT ID
			FROM	Users
			WHERE	UID = @UID
			AND	PWD = @PWD)

	IF @PostAdded = 1
	INSERT INTO Posts (Msgref,GroupRef,PostDate,Topic,UserID,Body,MsgLevel)
	VALUES (@MsgRef,@GroupRef,@PostDate,@Topic,@UserID,@Body,@MsgLevel)
	
	ELSE
		SELECT @PostAdded = 0 -- Else return false

	IF @PostAdded = 1
	UPDATE Users
	SET   NoOfPosts = NoOfPosts + 1
	WHERE   ID = @UserID

	RETURN 	@PostAdded --Return true if user exists
END

Vad den gör är att den först kollar lösenord och password. Sedan så tar den och ger datumet till @PostDate och sedan UserID:t till @UserID (vilket av någon konstig anledning gjorde så att jag var tvungen att göra om hela password checken! Fick det inte att funka på något annat sätt)

Sedan så tar det och sätter in alla posts. Och då var jag tvungen att göra en ny if sats (som jag förklarade innan) och sedan så uppdaterar den hur många posts användaren har gjort (där jag också fick göra en ny if sasts!).

Kan någon hjälpa mig att få ordning på begreppen? Detta funkar som sagt. Men det är nog inte riktigt så man ska göra det?

Sedan undrar jag ifall SQL har någon motsvarighet till javasript's Eval()?
Varför jag vill ha detta är pga att jag ska snart få tillgång till en SQL sever.
Men om jag vill göra en Table eller en ny procedur så vill jag ju inte behöva störa dem med att de ska in i databasen och uppdatera. Så jag tänkte göra en procedur där man kunde slänga in vilka SQL statments som helst genom asp.

Jag förutsätter att de har SQL Servern på intranät, så jag inte kan få direkt access till den via nätet. Men det finns kanske något annat sätt?

Det var det. Jätte glad ifall någon har svar på mina frågor! :)

------------------
/Magnus aka Zaphod
www.designmodule.com.bi

ZaphodMedlem sedan maj 2000107 inlägg
#2

Jag läste lite i BOL och kom fram till vad BEGIN var för något. Så jag ändrade koden, och det blev mycket bättre:

CREATE PROCEDURE AddNewPost 
	@UID		varChar(15), 	--User ID
	@PWD		varChar(10), 	--Password
	@Topic		varChar(40),	--Message Topic
	@Body		varChar(2000),	--Message Body Text, 2000 chars
	@MsgRef	int,		--Message Reference
	@GroupRef	int,		--Group Reference
	@MsgLevel	int		--Message Level
AS

	---See if username and password are corre with the same name exists
IF EXISTS(SELECT ID
	FROM		Users
	WHERE	UID = @UID	 --Check User ID
	AND		PWD = @PWD)  --Check Password
BEGIN
	DECLARE 	@PostAdded	Int	--Return value
	DECLARE 	@PostDate	dateTime
	DECLARE	@UserID	int	

	SELECT @PostAdded = 1, -- If user exists return true
		@PostDate = GetDate(), --Set Current Date
		@UserID = (SELECT ID
			FROM		Users
			WHERE	UID = @UID	 --Check User ID
			AND		PWD = @PWD)  --Check Password

	INSERT INTO Posts (Msgref,GroupRef,PostDate,Topic,UserID,Body,MsgLevel)
	VALUES (@MsgRef,@GroupRef,@PostDate,@Topic,@UserID,@Body,@MsgLevel)
	
	UPDATE Users
	SET	   NoOfPosts = NoOfPosts + 1
	WHERE   ID = @UserID

	RETURN 	@PostAdded --Return true if user exists
END
	ELSE
		SELECT @PostAdded = 0 -- Else return false

Men jag har fortfarande inte kommit ifrån att jag måste göra om password checken innan jag får id:t på usern. :(
Testade att nesta det med IF EXISTS. Men utan resultat.

Och vet fortfarande inte ifall det finns någon eval/execute sak (som jag beskrev i min förra post).

Är det någon som är väldigt bra på det här så får den personen Väldigt gärna agera lite personlig support och adda mig på ICQ #1462514. Eller bara svara här. Jag har lite mer frågor nämligen.

------------------
/Magnus aka Zaphod
www.designmodule.com.bi

ZaphodMedlem sedan maj 2000107 inlägg
#3

Allo?
Ingen som kan hjälpa mig?

------------------
/Magnus aka Zaphod
www.designmodule.com.bi

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