Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
Excorcist
Starting Member
1 Post |
Posted - 2011-01-25 : 10:29:07
|
Hello everyoneI'm relatively new to Sql server, and I would like to learn more.Trying to create completely flexible stored procedure using Dynamic statements.I have a handful of tables:CREATE TABLE [dbo].[Mesec]( [MesecID] [int] IDENTITY(1,1) NOT NULL, [Mesec] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, CONSTRAINT [PK_Mesec] PRIMARY KEY CLUSTERED ( [MesecID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]CREATE TABLE [dbo].[Godina]( [GodinaID] [int] IDENTITY(1,1) NOT NULL, [Godina] [int] NULL, CONSTRAINT [PK_Godina] PRIMARY KEY CLUSTERED ( [GodinaID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]CREATE TABLE [dbo].[Osoba]( [OsobaID] [int] IDENTITY(1,1) NOT NULL, [OsobaIme] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [OsobaPrezime] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, CONSTRAINT [PK_Osoba] PRIMARY KEY CLUSTERED ( [OsobaID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]CREATE TABLE [dbo].[Firma]( [FirmaID] [int] IDENTITY(1,1) NOT NULL, [FirmaNaziv] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [OsobaID] [int] NULL, CONSTRAINT [PK_Firma] PRIMARY KEY CLUSTERED ( [FirmaID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [dbo].[Firma] WITH CHECK ADD CONSTRAINT [FK_Firma_Osoba] FOREIGN KEY([OsobaID])REFERENCES [dbo].[Osoba] ([OsobaID])GOALTER TABLE [dbo].[Firma] CHECK CONSTRAINT [FK_Firma_Osoba]CREATE TABLE [dbo].[Faktura]( [FakturaID] [int] IDENTITY(1,1) NOT NULL, [Datum] [datetime] NULL, [FirmaID] [int] NULL, [UkupniFakturisaniIznos] [decimal](18, 2) NULL, CONSTRAINT [PK_Faktura] PRIMARY KEY CLUSTERED ( [FakturaID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [dbo].[Faktura] WITH CHECK ADD CONSTRAINT [FK_Faktura_Firma] FOREIGN KEY([FirmaID])REFERENCES [dbo].[Firma] ([FirmaID])GOALTER TABLE [dbo].[Faktura] CHECK CONSTRAINT [FK_Faktura_Firma]CREATE TABLE [dbo].[GodinaMesec]( [GodinaMesecID] [int] IDENTITY(1,1) NOT NULL, [GodinaID] [int] NULL, [MesecID] [int] NULL, CONSTRAINT [PK_GodinaMesec] PRIMARY KEY CLUSTERED ( [GodinaMesecID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [dbo].[GodinaMesec] WITH CHECK ADD CONSTRAINT [FK_GodinaMesec_Godina] FOREIGN KEY([GodinaID])REFERENCES [dbo].[Godina] ([GodinaID])ON DELETE CASCADEGOALTER TABLE [dbo].[GodinaMesec] CHECK CONSTRAINT [FK_GodinaMesec_Godina]GOALTER TABLE [dbo].[GodinaMesec] WITH CHECK ADD CONSTRAINT [FK_GodinaMesec_Mesec] FOREIGN KEY([MesecID])REFERENCES [dbo].[Mesec] ([MesecID])ON DELETE CASCADEGOALTER TABLE [dbo].[GodinaMesec] CHECK CONSTRAINT [FK_GodinaMesec_Mesec]CREATE TABLE [dbo].[GodinaMesecFirma]( [GodinaMesecFirmaID] [int] IDENTITY(1,1) NOT NULL, [FirmaID] [int] NULL, [GodinaMesecID] [int] NULL, [Sumarno] [decimal](30, 2) NULL, CONSTRAINT [PK_GodinaMesecFirma] PRIMARY KEY CLUSTERED ( [GodinaMesecFirmaID] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [dbo].[GodinaMesecFirma] WITH CHECK ADD CONSTRAINT [FK_GodinaMesecFirma_Firma] FOREIGN KEY([FirmaID])REFERENCES [dbo].[Firma] ([FirmaID])ON DELETE CASCADEGOALTER TABLE [dbo].[GodinaMesecFirma] CHECK CONSTRAINT [FK_GodinaMesecFirma_Firma]GOALTER TABLE [dbo].[GodinaMesecFirma] WITH CHECK ADD CONSTRAINT [FK_GodinaMesecFirma_GodinaMesec] FOREIGN KEY([GodinaMesecID])REFERENCES [dbo].[GodinaMesec] ([GodinaMesecID])ON DELETE CASCADEGOALTER TABLE [dbo].[GodinaMesecFirma] CHECK CONSTRAINT [FK_GodinaMesecFirma_GodinaMesec]I'm building stored procedure:CREATE PROCEDURE [dbo].[GodinaMesecFirmaGet] @DatumOd datetime, @DatumDo datetime, @OsobaID int, @FirmaID intASBEGIN SET NOCOUNT ON; Declare @GodinaOd int, @GodinaDo int, @Godina int, @MesecOd int, @MesecDo int, @MesecGornji int, @MesecDonji int, @SQLDynamic NVARCHAR(1024), @SQLDynamic1 NVARCHAR(1024), @SQLDynamicFirma NVARCHAR(1024), @SQLOrderby NVARCHAR(1024), @SQLRedovi NVARCHAR(1024) Set @MesecGornji = 12 Set @MesecDonji = 1 Set @GodinaOd = (Select datepart(year,@DatumOd)) Set @GodinaDo = (Select datepart(year,@DatumDo)) Set @MesecOd = (Select datepart(month,@DatumOd)) Set @MesecDo = (Select datepart(month,@DatumDo)) Set @SQLDynamic = 'Select gmf.*, g.Godina, m.Mesec, o.OsobaIme , o.OsobaPrezime, fi.FirmaNazivfrom GodinaMesecFirma gmf inner join godinamesec gm on gmf.GodinaMesecID = gm.GodinaMesecID inner join Godina g on gm.GodinaID = g.GodinaID inner join Mesec m on gm.MesecID = m.MesecID inner join Firma fi on fi.FirmaID = gmf.FirmaID inner join Osoba o on fi.OsobaID = o.OsobaID where (' if (@GodinaOd = @GodinaDo) Begin Set @SQLDynamic = @SQLDynamic + '(g.Godina = ' + convert (varchar, @GodinaOd) +' and m.MesecID between ' + convert (varchar, @MesecOd) + ' and '+ convert (varchar, @MesecDo) +')' Set @SQLDynamic1 = ')' End Else Begin Set @SQLDynamic = @SQLDynamic + '(g.Godina = ' + convert (varchar, @GodinaOd) +' and m.MesecID between ' + convert (varchar, @MesecOd) + ' and '+ convert (varchar, @MesecGornji) +')' Set @SQLDynamic1 = ' or (g.Godina = ' + convert (varchar, @GodinaDo) +' and m.MesecID between ' + convert (varchar, @MesecDonji) + ' and '+ convert (varchar, @MesecDo) +'))' End Set @SQLOrderby = ' Order by g.Godina, m.MesecID' Set @Godina = @GodinaOd + 1 if (@GodinaDo - @GodinaOd > 1) While (@GodinaDo - @Godina >= 1) Begin Set @SQLRedovi = ' or (g.Godina = ' + convert (varchar, @Godina) + ' and m.MesecID between 1 and 12)' Set @Godina = @Godina + 1 Set @SQLDynamic = @SQLDynamic + @SQLRedovi End Set @SQLDynamicFirma = '' if (@FirmaID IS NOT NUll) if (@FirmaID <> -1) Set @SQLDynamicFirma = ' and fi.FirmaID = ' + convert (varchar, @FirmaID) + ' ' Set @SQLDynamic = @SQLDynamic + @SQLDynamic1 + @SQLDynamicFirma + @SQLOrderby print @SQLDynamic exec (@SQLDynamic)ENDIt can handle whatever parameters I give it.I would also like to be able to search using varchar parameters but I don't seem to find a way to insert single quotation (') in my where clause. Is there any way to resolve this?I would like to add something like:@SqlFirmaNaziv = ' and fi.FirmaNaziv = ' + " @FirmaNaziv" and add it to @SQLDynamicThanks in advance |
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2011-01-25 : 11:15:40
|
quote: Trying to create completely flexible stored procedure using Dynamic statements
Hate to tell you this but that kind of thing completely defeats the purpose of stored procedures. If you really need this flexibility then just construct the SQL in your application. Be careful of SQL injection (sanitize input, check syntax, etc.) |
 |
|
|
|
|
|
|