Friday, March 9, 2012
Dynamic Deluxe!
if statement. So IF PERSON_AGE > 15 AND MONTHLY_PURCHASE_AMT > 1000 THEN
GIVE THEM 1500 POINTS.
Here is the deal. I need to do it both during a back end process and
dynamically when a person comes to the counter. These marketing programs ar
e
definable by the instituion so we can't build the query ahead of time.
Anythoughts on a good way to do this. Keep in mind that there might be
multiple marketing programs active and the person qualifies for more then on
e
all should be able to display to the user. I would like to use a function so
that I can return a select statement with the messages to be presented to th
e
user.
Thanks for any thoughts.
Sammy DIt depends how complex your promotional formula needs to get but for
range-based criteria you could do something like this:
CREATE TABLE Promotions (promotion_code CHAR(10) PRIMARY KEY,
points_award INTEGER NOT NULL, age_min INTEGER NOT NULL, age_max
INTEGER NOT NULL, purchase_amt_min NUMERIC(10,2) NOT NULL,
purchase_amt_max NUMERIC(10,2) NOT NULL, ...)
Example. Promotions applicable to customer 1234:
SELECT P.promotion_code, P.points_award
FROM X, Promotions AS P
WHERE X.age BETWEEN P.age_min AND P.age_max
AND X.purchase_amt BETWEEN P.purchase_amt_min AND P.purchase_amt_max
AND customer = 1234
Where a particular attribute isn't relevant to the promotion just set
those values to be the min and max for the datatype.
David Portas
SQL Server MVP
--|||You might consider using a decision table program and not a database at
all.
Wednesday, March 7, 2012
Dynamic database selection?
to another. Greatly simplified, it looks something like
create procedure import_widget as
begin
insert into our_widget (foo, bar)
select baz, quux from their_db.dbo.their_widget
end
go
The problem is that the name of the source database varies from
one system to another, so I want to pass the database name as a
parameter. I think I could do the following, but is there a
better way to go about it?
create procedure import_widget (@.db_name sysname) as
begin
exec 'create view their_widget as select * from '
+ @.db_name + '.dbo.their_widget'
insert into our_widget (foo, bar)
select baz, quux from their_widget
drop view their_widget
end
goEd Murphy (emurphy42@.socal.rr.com) writes:
Quote:
Originally Posted by
The problem is that the name of the source database varies from
one system to another, so I want to pass the database name as a
parameter. I think I could do the following, but is there a
better way to go about it?
On SQL 2005 you could use synonyms:
CREATE SYNONYM mytable AS thatdatabase.dbo.hertable
When you move to a new database you only need to update the synonyms.
--
Erland Sommarskog, SQL Server MVP, esquel@.sommarskog.se
Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/pr...oads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodin...ions/books.mspx|||Erland Sommarskog wrote:
Quote:
Originally Posted by
Ed Murphy (emurphy42@.socal.rr.com) writes:
Quote:
Originally Posted by
>The problem is that the name of the source database varies from
>one system to another, so I want to pass the database name as a
>parameter. I think I could do the following, but is there a
>better way to go about it?
>
On SQL 2005 you could use synonyms:
>
CREATE SYNONYM mytable AS thatdatabase.dbo.hertable
>
When you move to a new database you only need to update the synonyms.
Alas, this is SQL 2000 (or at least I expect it will be in a
significant number of cases).|||Ed Murphy (emurphy42@.socal.rr.com) writes:
Quote:
Originally Posted by
Erland Sommarskog wrote:
>
Quote:
Originally Posted by
>Ed Murphy (emurphy42@.socal.rr.com) writes:
Quote:
Originally Posted by
>>The problem is that the name of the source database varies from
>>one system to another, so I want to pass the database name as a
>>parameter. I think I could do the following, but is there a
>>better way to go about it?
>>
>On SQL 2005 you could use synonyms:
>>
> CREATE SYNONYM mytable AS thatdatabase.dbo.hertable
>>
>When you move to a new database you only need to update the synonyms.
>
Alas, this is SQL 2000 (or at least I expect it will be in a
significant number of cases).
Then the best may be to have a stored procedure in the other database
to retreive that data. You still need to construct the procedure name
dynamically, but since EXEC accepts a variable for the procedure name,
you don't have to use dynamic SQL.
That is you can say:
SELECT @.sp_name = @.dbname + '..that_sp'
EXEC @.sp_name
--
Erland Sommarskog, SQL Server MVP, esquel@.sommarskog.se
Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/pr...oads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodin...ions/books.mspx