Tag Archives: MS SQL

az internet sem jó mindenre

körbenéztem a neten - lustaság fél egészség -, hátha találok kész megoldást arra, hogy mit kell csinálni, ha egy dátum-idő (datetime) értékből csak a dátumra vagyok kíváncsi, az idő irreleváns.

a google toplistáján számtalan szebbnél szebb verzió van, arra az egy közös alapra kihegyezve, hogy az értéket szöveggé konvertálják, annak veszik a balsó n karakterét, majd ezt visszakonvertálják dátum-idő értékké - amely folyamatban n pozitív, egész szám és úgy érdemes meghatározni, hogy a szöveggé alakított értékből pont az órákat, perceket és másodperceket vágja le.

ez akár működhet is, feltételezve, hogy a szerveren soha, senki nem változtat beállításokat és az alkalmazást nem portolják más nyelvi/kulturális közegbe.

hogy csak a felszínt kapargassuk, létezik ugye short date format, long date format, utóbbiban léteznek párszáz féle nyelven leírott hónapnevek, léteznek eltérő szokások a y-m-d, m-d-y, d-m-y sorrendet illetően, léteznek különféle szeparátor kerekterek, és egyéni szokások arra vonatkozólag, hogy a szeparátor után köll-e szóköz vagy sem, meg úgy általában, ami perverziót csak el lehet képzelni, az előbb-utóbb fel is bukkan.

nagyon nem mindegy tehát, hogy n pontosan mennyi. dátumot sztringben kezelni egy pain in the ass.

mondjuk egy amerikában a fenti módszerrel megírt alkalmazás magyarországra hozva elég szép eséllyen döglik meg, és ha az egész nem is egy Y2K méretű probléma, de azért adatvesztésnek elég csinos lehet. szegény ördögök nyilván soha nem hallottak még arról, hogy a dátum-idő értékek minden épkézláb rendszerben számként vannak kezelve, unixokban a másodperceket számláló egészként, microsoft-közeli rendszerekben meg olyan floating point-ként, ahol az tizedespont előtti értékek a napok, az utániak meg a napon belüli időpont.

utóbbira adok egy tiszta megoldást.  haladóbbak a begin és end közötti részt a @r elhagyásával egy sorban is megoldhatják.

-- ===================================
-- Author:      moshi
-- Create date: 2008.03.11
-- Description: the name tells it all
-- ===================================
CREATE FUNCTION [dbo].[dateOnly] (@d DATETIME)
RETURNS DATETIME
AS BEGIN
  DECLARE @r REAL
  SET @r = FLOOR(CONVERT(REAL, @d))
  RETURN CONVERT(DATETIME, @r)
END

Tags:

… contains no columns that can be selected or the current user does not have permissions on that object

I’ve just skimmed through my stats and found that googling for the above expression is popular so much that you would never expect. Something tells me that most of the people need some reassuring words in English and not this transcript from the black box of an extraterrestrial space ship.

So. This the error message that you see when you try to run a SQL SELECT in a Microsoft SQL server environment on a MySQL database where the MySQL server is defined as a linked server.

When you face this problem you have probably done the first step successfully - defined the link. As far as I’m concerned, the only way to do that is using the MySQL ODBC driver:

EXEC master.dbo.sp_addlinkedserver @server = N’LinkedServerName’, @srvproduct = N’MySQL’, @provider = N’MSDASQL’, @provstr = N’Driver = {MySQL ODBC 3.51 Driver}; DB=[database]; SERVER=[server]; uid=[user_id]; pwd=[password]

Having done this, you are able to browse the MySQL server for databases and the databases for tables, views, etc. And then … you’re stuck here without a vague chance to access your data.

Don’t ask. I don’t know either. It may be a feature as well as a bug.

But you can have your data through the openquery command of the T-SQL like this:

SELECT * FROM OPENQUERY(LinkedServerName, ‘SELECT * FROM [table name]‘) AS tbl1

Quite strange. And uneasy. Not running the command itself but passing it as a string to a function is not what you normally do. Not even on linked servers.

Tags: , ,

nem piskóta

(for a version in a less exclusive language, click here.)

legalább három órányi szopáson vagyok túl, közben vagy ötször feltúrtam az egész internetet oda meg vissza, minimális sikerrel. tehát leírom, hátha másnak is jól jön.

alapfeladat

Microsoft SQL szerveren csatolt szerverként (linked server) létrehozni egy MySQL szervert, hogy MS SQL ütemezett tárolt eljárásokban MySQL adatokat tudjunk feldolgozni. tudom, perverz.

megoldás

egyetlen járható út van, a MySQL-hez nincsen OLE DB meghajtó, így marad az ODBC. azt még kis guglizással meg lehet találni, hogy egy ilyesmi parancs létrehozza a kapcsolatot:

EXEC master.dbo.sp_addlinkedserver @server = N’LinkedServerName’, @srvproduct = N’MySQL’, @provider = N’MSDASQL’, @provstr = N’Driver = {MySQL ODBC 3.51 Driver}; DB=[database]; SERVER=[server]; uid=[user_id]; pwd=[password]

ekkor azonban az ember egy olyan hülye helyzetben találja magát, hogy meg tudja tekinteni a MySQL katalógusokat (adatbázisokat), azokban a táblákat és a nézeteket, oszt jónapot. más csatolt MS SQL, DB2 vagy syBase működik rendesen, csak ez nem. mindenféle hibaüzeneteket generál, hogy például ez a tábla contains no columns that can be selected or the current user does not have permissions on that object.

merthogy adatokat lekérdezi meg egy OPENQUERY-s kanyarral kell:

SELECT * FROM OPENQUERY(LinkedServerName, ‘SELECT * FROM [table name]‘) AS tbl1

nehéz az élet.

Tags: , ,