Author |
Topic |
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2003-11-13 : 20:17:15
|
My boss ran the Best Practices Analyzer on one of our development servers and one of the things he traced for was SELECT *. It found a few instances (legacy code that we don't have time right now to change), but the strange thing was what it said. It said that SELECT * would not be permitted in stored procedures or UDFs in future versions. Now that's great, but starting at which version? Rob, Nigel, Jasper, Vyas, do you know if Yukon has done this?Tara |
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2003-11-13 : 21:02:06
|
So far the beta version allows SELECT * in a sproc and UDF. I'd take exception to a "best practices" analyzer or compiler that disallowed that though. Might as well remove the SELECT * syntax entirely, what would be the point of disallowing it in sproc's and UDF's but allowing it in views and general queries? |
 |
|
AjarnMark
SQL Slashing Gunting Master
3246 Posts |
Posted - 2003-11-14 : 12:00:47
|
It's interesting that something scanning for best practices would tell you about something that would be completely forbidden in the future. However, at PASS they did show a little bit of what I will call auto-scripting of stored procedures. They demo'd some features that would build your sproc parameters based on the table definition (like for a simple INSERT sproc). This looked more like what someone would see who builds stored procedures in Enterprise Manager, and nobody here would do a thing like that, would they?I also heard rumblings that they would detect a data type change in a table and automatically update stored procedure parameter definitions, etc. I didn't see this actually demo'd, and again, I'm sure this is only for those who are making their changes via the Enterprise Manager aspect of Workbench. I could rant on this topic for a long time, but let me summarize as this: 1) SCRIPT IT! and 2) I don't want the computer making changes in other objects for me automatically (at least not without my prior consent on each individual change).--------------------------------------------------------Visit the SQLTeam Weblogs at [url]http://weblogs.sqlteam.com[/url] |
 |
|
chadmat
The Chadinator
1974 Posts |
Posted - 2003-11-14 : 13:19:15
|
I doubt Yukon will forbid this, however I hope it does happen soon. Usually they talk about forbiding something for a few releases before actually taking it out (To give you time to clean up existing code).-Chadhttp://www.clrsoft.comSoftware built for the Common Language Runtime. |
 |
|
tkizer
Almighty SQL Goddess
38200 Posts |
Posted - 2003-11-14 : 13:21:23
|
Whenever it does happen, it will be a dream come true.Tara |
 |
|
Merkin
Funky Drop Bear Fearing SQL Dude!
4970 Posts |
Posted - 2003-11-14 : 18:44:17
|
I'd love to see it. It would upset SO many people Mark, if you want to see how to do cool code generation now, check out <broken record>Codesmith</broken record> from here http://www.ericjsmith.net/codesmith/ Maybe I should write an article about it, this tool saves me SO much time.Damian |
 |
|
X002548
Not Just a Number
15586 Posts |
Posted - 2003-12-02 : 15:25:43
|
It'd be awesome...but do you know how much stuff would begin to blow up?Brett8-) |
 |
|
eyechart
Master Smack Fu Yak Hacker
3575 Posts |
Posted - 2003-12-02 : 16:00:36
|
stuff blows up now because people use select * |
 |
|
Billpl
Yak Posting Veteran
71 Posts |
Posted - 2004-06-03 : 21:53:12
|
ya know, the more I think about this subject the more I start to disagree.For starters. When I developing I always use *. That way I can focus on the business object and pick and chose fields as needed. When I'm done I will simply determine which fields are needed and adjust the SP. Plus when I'm in SQL Analyzer (which is always open when I work) I'd hate to have to type in the field names. That would waste countless hours.Second. What would be the logic in having it removed from SP's & UDF's but not general queries and Views. Wouldn't it be the other way around? The procedure level is where the best decisions can be made about the output data. The guy that's more likely to burn down the server is the arrant client who *'s out some 45 field monster table just to grab a few fields, not the low level guy who's maintaining tightly controlled systems that are prone to RAD business changes, etc.One thought in the opposite direction. Expanding * functionality. How about something like this "Select a.*( -Field1, -Field6,.. )..." where you could leave off fields instead.just a thought... |
 |
|
byrmol
Shed Building SQL Farmer
1591 Posts |
Posted - 2004-06-03 : 22:32:57
|
As much as I hate to say it.. this is not a good idea. Actually I think they have it the wrong way around..as Bill said.. It should be prohibited from views!By all means, tell me I suck when the "analyser" finds its use but please, leave it to me!Bill, the REMOVE keyword is used in only one product I know and the language is not SQL..FYI, you're wish would be written as "SELECT Employee REMOVE { Field1, field6 }".. There is no need for a "*" simply because it has a real projection operator. "SELECT Employee" returns all columns, projection is achieved with the "OVER" keyword..[url]http://docs.alphora.com/D4LGProjectandRemove.html[/url]DavidM"Always pre-heat the oven" |
 |
|
nr
SQLTeam MVY
12543 Posts |
Posted - 2004-06-04 : 07:29:09
|
if exists (select * from ...)select * is really useful to get the column names when you are looking at a system from query analyser.Would be nice to prevent it in SPs, views, ufd's etc except against temp tables but you would also want to prevent it being used from applications - don't see how you could do that and stil allow it from query analyser.An app to build SPs based on table defintions and updating when the table structure changes has to be one of the most useless things I've heard of.==========================================Cursors are useful if you don't know sql.DTS can be used in a similar way.Beer is not cold and it isn't fizzy. |
 |
|
derrickleggett
Pointy Haired Yak DBA
4184 Posts |
Posted - 2004-06-05 : 16:29:42
|
:) Well, at least you have an opinion Nigel.MeanOldDBAderrickleggett@hotmail.comWhen life gives you a lemon, fire the DBA. |
 |
|
Kristen
Test
22859 Posts |
Posted - 2004-06-06 : 07:22:10
|
quote: Originally posted by nr select * is really useful to get the column names when you are looking at a system from query analyser.
I have a little SProc that does that - gives me a comma separated list (e.g. for INSERT), each column name on a separate line with a trailing comma (e.g. for SELECT), repeated using friendly name (e.g. SELECT [Customer name] = CustName, ...), DECLARE statement, JOINs for all FKeys and the PKs as a comma separately list (useful for ORDER BY).I just cut&paste the bit from the results into whatever I'm building (I appreciate that this is mostly available from Object Browser, but there were some style things I wanted of my own).quote: An app to build SPs based on table defintions and updating when the table structure changes has to be one of the most useless things I've heard of.
We do that! We have standard SProcs for GET / SAVE and DELETE. These are mechanically generated with defined areas where we add Business Rules etc. When we change the schema of the table we re-run them and compare&merge the "New" and "Actual" versions.(FWIW our SAVE SProcs are "UpSert" - they INSERT if not exists, otherwise UPDATE. They have another of other abilities (basically to cater for data conversion or parameters originating from Web based FORMs)Kristen |
 |
|
nr
SQLTeam MVY
12543 Posts |
Posted - 2004-06-06 : 20:44:53
|
>> I have a little SProc that does that you meanselect name + ' ,' from syscolumns where id = object_id('tbl) order by colidI always just code it when I need it.I meant getting the col name to paste into a query.==========================================Cursors are useful if you don't know sql.DTS can be used in a similar way.Beer is not cold and it isn't fizzy. |
 |
|
Kristen
Test
22859 Posts |
Posted - 2004-06-07 : 05:29:16
|
quote: Originally posted by nr >> I have a little SProc that does that you meanselect name + ' ,' from syscolumns where id = object_id('tbl) order by colid
Not quite, it does that but in a variety of different flavours so I can cut & paste whichever chunk I needquote: I meant getting the col name to paste into a query.
Yup, I do do that - SELECT TOP 10 * FROM MyTable - seems so much quicker to me than clicking around the Object Browser, but its horses for courses.I'll bung some sample output from my SProc below, using Northwind [Order Detail] as an example. I've had to contrieve the JOINs 'coz my SProc relies on some intermediate data in tables which I haven't got set up in Northwind, so I did find&replace on some of the names to make the example, but you'll get the idea no doubt!.One slight benefit is that I can pass a partial LIKE table name to the SProc, or even a column name, which saves a bit of typing - it provides a list of suitable EXEC commands if the table name is ambiguous.Kristen------------ -------------------------------------------------Column list: OrderID, ProductID, UnitPrice, Quantity, Discount Table: dbo.[order details] PK: OrderID, ProductIDSELECT (syscolumns)-------------------------------------------------------- SELECT OrderID, -- Order Number ProductID, -- Product Number UnitPrice, -- Unit Price Quantity, -- Quantity Discount -- Discount FROM dbo.[order details] ORDER BY OrderID, ProductIDSELECT (sysproperties)---------------------------------------------------------------------------- SELECT [Order Number] = OrderID, [Product Number] = ProductID, [Unit Price] = UnitPrice, [Quantity] = Quantity, [Discount] = Discount FROM dbo.[order details] ORDER BY OrderID, ProductIDDECLARE----------------------------------------------------------------------------DECLARE @OrderID [int], -- Order Number @ProductID [int], -- Product Number @UnitPrice [money], -- Unit Price @Quantity [smallint], -- Quantity @Discount [real], -- DiscountPK Columns---------------------------------------------------------OrderID,ProductID,JOIN Description Parent Column Child table---- ---------------------------------------- -------------- ---------------J Order ID:Order Header OrderID [Orders] SELECT TOP 10 * FROM [order details] OD LEFT OUTER JOIN dbo.[Orders] OI ON OI.OrderID = OD.OrderIDJOIN Description Parent Column Child table---- ---------------------------------------- -------------- ---------------J Product Code:Product ProductID [Products] SELECT TOP 10 * FROM [order details] OI LEFT OUTER JOIN dbo.[Products] P ON P.ProductID = OI.ProductIDJOIN Description Parent Column Child table---- ---------------------------------------- -------------- ---------------D Order ID:Order Item OrderID [order details] SELECT TOP 10 * FROM [Orders] OI LEFT OUTER JOIN dbo.[order details] OD ON OD.OrderID = OI.OrderID -- Use this query to produce a column list with a count of the number of rows (where used)------------------------------------------------------------------------------------------SELECT ' OrderID,', '--', (select SUM(CASE WHEN OrderID IS NULL THEN 0 ELSE 1 END) from [order details])UNION ALL SELECT ' ProductID,', '--', (select SUM(CASE WHEN ProductID IS NULL THEN 0 ELSE 1 END) from [order details])UNION ALL SELECT ' UnitPrice,', '--', (select SUM(CASE WHEN UnitPrice IS NULL THEN 0 ELSE 1 END) from [order details])UNION ALL SELECT ' Quantity,', '--', (select SUM(CASE WHEN Quantity IS NULL THEN 0 ELSE 1 END) from [order details])UNION ALL SELECT ' Discount,', '--', (select SUM(CASE WHEN Discount IS NULL THEN 0 ELSE 1 END) from [order details])-- Use this query to produce a column list with Max Length of the data in that column-------------------------------------------------------------------------------------SELECT ' OrderID,', (select MAX(DATALENGTH(OrderID)) from [order details])UNION ALL SELECT ' ProductID,', (select MAX(DATALENGTH(ProductID)) from [order details])UNION ALL SELECT ' UnitPrice,', (select MAX(DATALENGTH(UnitPrice)) from [order details])UNION ALL SELECT ' Quantity,', (select MAX(DATALENGTH(Quantity)) from [order details])UNION ALL SELECT ' Discount,', (select MAX(DATALENGTH(Discount)) from [order details]) |
 |
|
aiken
Aged Yak Warrior
525 Posts |
Posted - 2004-09-20 : 18:05:53
|
I'll resurrect this one.First, for getting column names, what's wrong with "sp_help tablename"? It's easier to type, and it shows you the datatypes as well.Second, for "if exists", why not "if exists (select 1 from tablename where...)"?Me, I'm happy about this change.Cheers-b |
 |
|
spirit1
Cybernetic Yak Master
11752 Posts |
Posted - 2004-09-21 : 07:21:26
|
quote: Originally posted by aikenSecond, for "if exists", why not "if exists (select 1 from tablename where...)"?
this is acctualy the only exception when (select * ...) should be used. has to do with indexes. sql server chooses the best index to execute this and so it's faster.i read it on this very forum Go with the flow & have fun! Else fight the flow |
 |
|
derrickleggett
Pointy Haired Yak DBA
4184 Posts |
Posted - 2004-09-21 : 07:42:11
|
where?MeanOldDBAderrickleggett@hotmail.comWhen life gives you a lemon, fire the DBA. |
 |
|
spirit1
Cybernetic Yak Master
11752 Posts |
Posted - 2004-09-21 : 07:56:54
|
as soon as the search page doesn't time out on me i'll try to find it.Go with the flow & have fun! Else fight the flow |
 |
|
spirit1
Cybernetic Yak Master
11752 Posts |
|
Kristen
Test
22859 Posts |
Posted - 2004-09-21 : 13:59:44
|
"what's wrong with "sp_help tablename"?"It doesn't present the columns in a style suitable for use in SELECT or INSERT etc. which is what I wrote my little SProc to do instead.I have since added the ability to create a SELECT list suitable for INSERT statement and XML in/output:SELECT sop_ordh_ID = 9999999, -- Order ID [Identity] [PK] sop_ordh_Date = 'ddmmyyyy', -- Date sop_ordh_cust_Code = 'XXX30', -- Customer Code sop_ordh_TotalPrice = $99999.99, -- Total Price...FROM dbo.DNG_SOP_ORDH_OrderHeaderORDER BY sop_ordh_ID where the required type of the field is indicated (mainly used for importing from "weird" sources, hence need to constrain input to appropriate type and length (my SProc is aware of the superset-datatypes we use, hence 'XXX30' implies max 30 alphanumerics, in a forced Capitals field)andSELECT [Tag] = 1, [Parent] = NULL, [DNG_SOP_ORDH_OrderHeader!1!sop_ordh_ID!element] = 9999999, -- Order ID [Identity] [PK] [DNG_SOP_ORDH_OrderHeader!1!sop_ordh_Date!element] = 'ddmmyyyy', -- Date [DNG_SOP_ORDH_OrderHeader!1!sop_ordh_cust_Code!element] = 'XXX30', -- Customer Code [DNG_SOP_ORDH_OrderHeader!1!sop_ordh_TotalPrice!element] = $99999.99, -- Total Price... Kristen |
 |
|
Next Page
|