webForumDet fria alternativet

Stored prodedure

7 svar · 232 visningar · startad av erka

erkaMedlem sedan dec. 19994 597 inlägg
#1

Hej, i databasen jag har kan man ha två värden (olika grupper som ska visas), de är antingen 1 eller 2. Dessa värden skickar man med till sp:n för att få ut en grupp, nu försöker jag fixa så att om man skickar med 3 ska man få med båda grupperna.

Nu har jag följande kod

@visibility int,
@language int,
@group varchar(100)

AS

IF @group = 3
BEGIN
SET @group = '1 OR Model.FKgroupID = 2'
END

SELECT     Model.PKmodelID, Model.ModelName, ModelDescription.FullModelName, ModelDescription.Description
FROM         Model INNER JOIN
                      ModelDescription ON Model.PKmodelID = ModelDescription.PKmodelID INNER JOIN
                      ModelVisibilityLink ON Model.PKmodelID = ModelVisibilityLink.PKmodelID INNER JOIN
                      ProductGroup ON Model.FKproductGroupID = ProductGroup.PKproductGroupID
WHERE ModelDescription.PKlanguageID = @language AND ModelVisibilityLink.PKvisibilityID = @visibility AND Model.FKgroupID = @group

Om jag skickar med 3 får jag följande felmeddelande

Syntax error converting the varchar value '1 OR Model.FKgroupID = 2' to a column of data type int.

(det funkar med att skicka med 1 eller 2 dock, vilket det ska), så min fråga är hur fan jag konverterar det rätt så att säga.

Tacksam

@ndersMedlem sedan juni 200026 914 inlägg
#2

Kan man inte göra så här?

@visibility int,
@language int,
@group varchar(100)

AS

IF @group = 3
BEGIN
SET @group = '1, 2'
END

SELECT     Model.PKmodelID, Model.ModelName, ModelDescription.FullModelName, ModelDescription.Description
FROM         Model INNER JOIN
                      ModelDescription ON Model.PKmodelID = ModelDescription.PKmodelID INNER JOIN
                      ModelVisibilityLink ON Model.PKmodelID = ModelVisibilityLink.PKmodelID INNER JOIN
                      ProductGroup ON Model.FKproductGroupID = ProductGroup.PKproductGroupID
WHERE ModelDescription.PKlanguageID = @language AND ModelVisibilityLink.PKvisibilityID = @visibility AND Model.FKgroupID IN (@group)

Det kanske inte fungerar dock. Annars får du lägga in alltihop i en sträng som du sedan exekverar med EXEC.

Mvh,

erkaMedlem sedan dec. 19994 597 inlägg
#3

Nej får samma felmeddelande fast på 1, 2 då. Det var just det jag undrade hur man sätter ihop allt till en sträng som jag exekverar, alltså bygga upp strängen med lite till om det skulle vara en 3:a i @group

tack

@ndersMedlem sedan juni 200026 914 inlägg
#4

Exempel:

declare @query varchar(8000)
...
SET @group = '1, 2'
SET @query = 'SELECT * FROM tabellen WHERE fältet IN (' + @group + ')'

EXEC @query

Mvh,

LarsGMedlem sedan dec. 200012 465 inlägg
#5
declare @g1, @g2 int
if @group = 1 select @g1 = 1,@g2 = 1
if @group = 2 select @g1 = 2,@g2 = 2
if @group = 3 select @g1 = 1,@g2 = 2 

SELECT     Model.PKmodelID, Model.ModelName, ModelDescription.FullModelName, ModelDescription.Description
FROM         Model INNER JOIN
                      ModelDescription ON Model.PKmodelID = ModelDescription.PKmodelID INNER JOIN
                      ModelVisibilityLink ON Model.PKmodelID = ModelVisibilityLink.PKmodelID INNER JOIN
                      ProductGroup ON Model.FKproductGroupID = ProductGroup.PKproductGroupID
WHERE ModelDescription.PKlanguageID = @language AND ModelVisibilityLink.PKvisibilityID = @visibility AND Model.FKgroupID IN (@g1,@g2)

så slipper du dynamisk sql

exec (@query)

erkaMedlem sedan dec. 19994 597 inlägg
#6

Tack båda, men jag förstår inte riktigt hur jag ska skriva den i spn

koden nu blir

CREATE PROCEDURE [spModels]
@visibility int,
@language int,
@group int,
@g1 int,
@g2 int
AS

if @group = 1 select @g1 = 1,@g2 = 1
if @group = 2 select @g1 = 2,@g2 = 2
if @group = 3 select @g1 = 1,@g2 = 2 

SELECT     Model.PKmodelID, Model.ModelName, ModelDescription.FullModelName, ModelDescription.Description
FROM         Model INNER JOIN
                      ModelDescription ON Model.PKmodelID = ModelDescription.PKmodelID INNER JOIN
                      ModelVisibilityLink ON Model.PKmodelID = ModelVisibilityLink.PKmodelID INNER JOIN
                      ProductGroup ON Model.FKproductGroupID = ProductGroup.PKproductGroupID
WHERE ModelDescription.PKlanguageID = @language AND ModelVisibilityLink.PKvisibilityID = @visibility AND Model.FKgroupID IN (@g1,@g2)
GO
LarsGMedlem sedan dec. 200012 465 inlägg
#7
CREATE PROCEDURE spModels
@visibility int,
@language int,
@group int 
AS
declare @g1 int,@g2 int
if @group = 1 select @g1 = 1,@g2 = 1
if @group = 2 select @g1 = 2,@g2 = 2
if @group = 3 select @g1 = 1,@g2 = 2 

SELECT     Model.PKmodelID, Model.ModelName, ModelDescription.FullModelName, ModelDescription.Description
FROM         Model INNER JOIN
                      ModelDescription ON Model.PKmodelID = ModelDescription.PKmodelID INNER JOIN
                      ModelVisibilityLink ON Model.PKmodelID = ModelVisibilityLink.PKmodelID INNER JOIN
                      ProductGroup ON Model.FKproductGroupID = ProductGroup.PKproductGroupID
WHERE ModelDescription.PKlanguageID = @language AND ModelVisibilityLink.PKvisibilityID = @visibility AND Model.FKgroupID IN (@g1,@g2)
GO
erkaMedlem sedan dec. 19994 597 inlägg
#8

LarsG, stort tack, nu ser jag ju hur man kan göra. Lärde mig mycket på det, danke danke. @nders, du ska ha tack oxå :)

Genererad på 392 ms · cache AV · v20260730165559-full.f96bc7eb