Hi guys,
I'm trying to make a dynamic sql statement, but it doesn't work. (In the code pasted under this I've only worked with the first statement, so the rest of the variables aren't correctly set in the sp_executesql statement). I reckon I will manage the rest if someone could just help me past the first issue(s) in the "fornavn" part. I would also love to hear it if there's a better way of tackling this problem.
Even though the printed statement looks right, I get the following when printing it out and then executing:
USE [Maria]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[Maria_SearchMedlem]
@fornavn = N'la'--,
--@fornavn_eksakt = NULL,
--@etternavn = NULL,
--@etternavn_eksakt = NULL
SELECT 'Return Value' = @return_value
GO
SELECT Medlemmer.medlemsnummer, Medlemmer.fornavn, Medlemmer.etternavn, Medlemmer.adresse1, Medlemmer.adresse2, Medlemmer.postnummer,
Medlemmer.sted, Medlemmer.tittel, Medlemmer.fdato, Medlemmer.epost, Medlemmer.tlf_priv, Medlemmer.tlf_jobb, Medlemmer.tlf_mob,
Medlemmer.utmeldt_bevis, Medlemmer.utmeldt, Medlemmer.levert_emblem, Medlemmer.død, Medlemmer.død_melding, Medlemmer.død_status,
Medlemmer.ordensgrad, Land.land
FROM Medlemmer LEFT OUTER JOIN
Land ON Medlemmer.land = Land.id WHERE 1=1 and fornavn like '%' + @fornavn_input + '%'
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.
(1 row(s) affected)
To me, that looks pretty valid...Could someone please point out the problem with that?
The whole sproc is like this:
USE [Maria]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Maria_SearchMedlem]
@medlemsnummer int = null,
@fornavn nvarchar(100) = null,
@fornavn_eksakt bit = null,
@etternavn nvarchar(100) = null,
@etternavn_eksakt bit = null,
@adresse1 nvarchar(MAX) = null,
@adresse2 nvarchar(MAX) = null,
@postnummer nchar(10) = null,
@sted nvarchar(50) = null,
@land int = null,
@tittel nvarchar(MAX) = null,
@fdato_fra date = null,
@fdato_til date = null,
@epost nvarchar(MAX) = null,
@tlf_priv nvarchar(20) = null,
@tlf_jobb nvarchar(20) = null,
@tlf_mob nvarchar(20) = null,
@utmeldt_bevis bit = null,
@utmeldt_fra date = null,
@utmeldt_til date = null,
@levert_emblem bit = null,
@dod_fra date = null,
@dod_til date = null,
@dod_melding_fra date = null,
@dod_melding_til date = null,
@dod_status nvarchar(MAX) = null,
@ordensgrad_fra date = null,
@ordensgrad_til date = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @base_query nvarchar(max)
set @base_query = '
SELECT Medlemmer.medlemsnummer, Medlemmer.fornavn, Medlemmer.etternavn, Medlemmer.adresse1, Medlemmer.adresse2, Medlemmer.postnummer,
Medlemmer.sted, Medlemmer.tittel, Medlemmer.fdato, Medlemmer.epost, Medlemmer.tlf_priv, Medlemmer.tlf_jobb, Medlemmer.tlf_mob,
Medlemmer.utmeldt_bevis, Medlemmer.utmeldt, Medlemmer.levert_emblem, Medlemmer.død, Medlemmer.død_melding, Medlemmer.død_status,
Medlemmer.ordensgrad, Land.land
FROM Medlemmer LEFT OUTER JOIN
Land ON Medlemmer.land = Land.id'
declare @params nvarchar(max)
set @params = ' WHERE 1=1'
if ((@fornavn is not null) AND (@fornavn <> ''))
begin
if @params <> '' set @params = @params + ' and '
if @fornavn_eksakt = 1 set @params = @params + 'fornavn = @fornavn_input'
else set @params = @params + 'fornavn like ' + char(39) + '%' + char(39) + ' + @fornavn_input + ' + char(39) + '%' + CHAR(39)
end
if ((@etternavn is not null) AND (@etternavn <> ''))
begin
if @params <> '' set @params = @params + ' and '
if @etternavn_eksakt = 1 set @params = @params + 'etternavn = \@etternavn'
else set @params = @params + 'etternavn like ' + char(39) + '%' + char(39) + ' + @etternavn_input + ' + char(39) + '%' + CHAR(39)
end
if @adresse1 is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'adresse1 like ' + char(39) + '%' + char(39) + ' + @adresse1_input + ' + char(39) + '%' + CHAR(39)
end
if @adresse2 is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'adresse2 like ' + char(39) + '%' + char(39) + ' + @adresse2_input + ' + char(39) + '%' + CHAR(39)
end
if @postnummer is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'postnummer = @postnummer'
end
if @sted is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'sted like ' + char(39) + '%' + char(39) + ' + @sted_input + ' + char(39) + '%' + CHAR(39)
end
if @land is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'land like ' + char(39) + '%' + char(39) + ' + @land_input + ' + char(39) + '%' + CHAR(39)
end
if @tittel is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'tittel like ' + char(39) + '%' + char(39) + ' + @tittel_input + ' + char(39) + '%' + CHAR(39)
end
if @fdato_fra is not null
begin
if @params <> '' set @params = @params + ' and '
if @fdato_til is not null set @params = @params + 'fdato > @fdato_fra AND fdato < @fdato_til'
else set @params = @params + 'fdato = @fdato_fra'
end
if @epost is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'epost = @epost'
end
if @tlf_priv is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'tlf_priv = @tlf_priv'
end
if @tlf_mob is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'tlf_mob = @tlf_mob'
end
if @tlf_jobb is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'tlf_jobb = @tlf_jobb'
end
if @utmeldt_bevis is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'utmeldt_bevis = @utmeldt_bevis'
end
if @utmeldt_fra is not null
begin
if @params <> '' set @params = @params + ' and '
if @utmeldt_til is not null set @params = @params + 'utmeldt > @utmeldt_fra and utmeldt < @utmeldt_til'
else set @params = @params + 'utmeldt = @utmeldt_fra'
end
if @levert_emblem is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + 'levert_emblem = @levert_emblem'
end
if @dod_fra is not null
begin
if @params <> '' set @params = @params + ' and '
if @dod_til is not null set @params = @params + 'død > @dod_fra and død < @dod_til'
else set @params = @params + 'død = @dod_fra'
end
if @dod_melding_fra is not null
begin
if @params <> '' set @params = @params + ' and '
if @dod_melding_til is not null set @params = @params + 'død_melding > @dod_melding_fra and død_melding < @dod_melding_til'
else set @params = @params + 'død_melding = @dod_melding_fra'
end
if @ordensgrad_fra is not null
begin
if @params <> '' set @params = @params + ' and '
if @ordensgrad_til is not null set @params = @params + 'ordensgrad > @ordensgrad_fra and ordensgrad < @ordensgrad_til'
else set @params = @params + 'ordensgrad = @ordensgrad_fra'
end
if @dod_status is not null
begin
if @params <> '' set @params = @params + ' and '
set @params = @params + '@død_status like ' + char(39) + '%' + char(39) + ' + @dod_status_input + ' + char(39) + '%' + CHAR(39)
end
declare @query nvarchar(max)
set @query = @base_query + @params
print @query
execute sp_executesql @statement = @query, @params = N'@fornavn_input nvarchar(100),@medlemsnummer,
@fornavn,
@fornavn_eksakt,
@etternavn,
@etternavn_eksakt,
@adresse1,
@adresse2,
@postnummer,
@sted,
@land,
@tittel,
@fdato_fra,
@fdato_til,
@epost,
@tlf_priv,
@tlf_jobb,
@tlf_mob,
@utmeldt_bevis,
@utmeldt_fra,
@utmeldt_til,
@levert_emblem,
@dod_fra,
@dod_til,
@dod_melding_fra,
@dod_melding_til,
@dod_status,
@ordensgrad_fra,
@ordensgrad_til', @fornavn_input = @fornavn;
END
Thanks!