вторник, 25 февраля 2014 г.

HTTP request

Понадобилось мне сделать http-запрос (get/post), нашел такой вариант реализации:

Declare @Object as Int ;
Declare @ResponseText as Varchar(8000) ;
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT ;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
    'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT',
    'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select  @ResponseText
Exec sp_OADestroy @Object

Если ответ больше varchar(8000), то @ResponseText будет NULL, в остальных случаях мною проблем не замечено. Использовал на SQL Server 2005.
Взято отсюда.


вторник, 15 января 2013 г.

Разбивка периода по месяцам или часам

Разбить период с 18.09.2012 по 24.01.2013 помесячно можно следующим запросом, например:

declare @firstdate datetime, @lastdate datetime
select @firstdate = '20120918', @lastdate = '20130124'

select
case when d1>@firstdate then d1 else @firstdate end as d1,
case when d2<@lastdate then d2 else @lastdate end as d2
from
(
select
dateadd(mm,datediff(mm,'19000101',@firstdate)+number,'19000101') as d1,
dateadd(mm,datediff(mm,'19000101',@firstdate)+number+1,'19000101')-1 as d2
from master..spt_values
where type='P'
and number<=datediff(mm,@firstdate,@lastdate)
) ttt

Результат:


2012-09-18 00:00:00.000 2012-09-30 00:00:00.000
2012-10-01 00:00:00.000 2012-10-31 00:00:00.000
2012-11-01 00:00:00.000 2012-11-30 00:00:00.000
2012-12-01 00:00:00.000 2012-12-31 00:00:00.000
2013-01-01 00:00:00.000 2013-01-24 00:00:00.000

Источник: http://www.sql.ru/forum/actualthread.aspx?tid=599280&pg=1&mid=6234623#6234623


И еще аналогично по часам:


declare @firstdate datetime, @lastdate datetime
select @firstdate = dateadd(hh, -24, getdate()), @lastdate = getdate()

select
case when d1>@firstdate then d1 else @firstdate end as d1,
case when d2<@lastdate then d2 else @lastdate end as d2
from
(
select
dateadd(hh,datediff(hh,'19000101',@firstdate)+number,'19000101') as d1,
dateadd(hh,datediff(hh,'19000101',@firstdate)+number+1,'19000101') as d2
from master..spt_values
where type='P'
and number<=datediff(hh,@firstdate,@lastdate)
) ttt

понедельник, 6 августа 2012 г.

Excel linked server


Скрипт:

EXEC master.dbo.sp_addlinkedserver @server = N'EXCEL_TMP', @srvproduct=N'excel', @provider=N'Microsoft.Jet.OLEDB.4.0', @datasrc=N'C:\Temp\sht.xls', @provstr=N'Excel 8.0'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'EXCEL_TMP', @optname=N'use remote collation', @optvalue=N'true'



Доступ к данным:

select * from EXCEL_TMP...[Лист1$]
или
select * from EXCEL_TMP...[Sheet1$]

среда, 1 августа 2012 г.

Linked server SQLite

  1. Установить ODBC драйвер для SQLite. В Win7 64 были какие-то косяки с 32-разрядным драйвером SQLite, поэтому пришлось ставить 64-разрядный драйвер. Потом пришлось ставить и 64-разрядный SQL Server, т.к. 32-разрядный не желал линковаться с 64 ODBC SQLite.
  2. Создать системный DSN (Панель управления - Администрирование - Источники данных (ODBC).
  3. В провайдере на sql server'е поставить пару галок, как на картинке:


Скрипт созданного linked server:
-- @server задается имя сервера, @datasrc это имя созданного системного DSN

EXEC master.dbo.sp_addlinkedserver @server = N'dns', @srvproduct=N'SQLite3 Datasource', @provider=N'MSDASQL', @datasrc=N'dns'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'dns', @optname=N'use remote collation', @optvalue=N'true'

Пример запроса:

SELECT * FROM dns...table1

воскресенье, 6 мая 2012 г.

Чувствительность к регистру в запросах

По умолчанию чувствительность к регистру отключена и collation ставится Cyrillic_General_CI_AS. Чтобы в запросе учитывался регистр букв достаточно написать collate Cyrillic_General_CS_AS.
Либо иной collation из всех доступных на сервере:

SELECT name, description
FROM fn_helpcollations();



Примеры запросов:


select field1, field2
from table1
where field2 collate Cyrillic_General_CS_AS = 'ТЕСТ'



select field1, field2
from table1
order by field2 collate Cyrillic_General_CS_AS

четверг, 29 декабря 2011 г.

Перевод UNIX-времени в нормальный вид

Создание функции для перевода unix-времени в привычный вид

CREATE FUNCTION [dbo].[UnixTimeToNormal]
(
@UNIX_TIME int
)
RETURNS datetime
AS
BEGIN
declare @OutputDate datetime
-- Using dateadd to add seconds to 1970-01-01
select @OutputDate = dateadd(ss,@UNIX_TIME,'1970-01-01')
return @OutputDate
END

понедельник, 2 мая 2011 г.

Формат даты

     Для вывода даты в формате DD.MM.YYYY

SomeDate = CONVERT(VarChar(50), getdate(), 104)

   Выведется текущая дата в указанном формате. Формат указывается цифрами, в данном случае 104. 

      Остальные значения:

SELECT CONVERT(varchar, getdate(), 2)    -- 'yy.mm.dd'
SELECT CONVERT(varchar, getdate(), 3)    -- 'dd/mm/yy'
SELECT CONVERT(varchar, getdate(), 4)    -- 'dd.mm.yy'
SELECT CONVERT(varchar, getdate(), 5)    -- 'dd-mm-yy'
SELECT CONVERT(varchar, getdate(), 6)    -- 'dd mmm yy'
SELECT CONVERT(VarChar, GETDATE(), 101)  -- 'mm/dd/yyyy'
SELECT CONVERT(VarChar, GETDATE(), 102)  -- 'yyyy.mm.dd'
SELECT CONVERT(VarChar, GETDATE(), 103)  -- 'dd/mm/yyyy'
SELECT CONVERT(VarChar, GETDATE(), 104)  -- 'dd.mm.yyyy'
SELECT CONVERT(varchar, GETDATE(), 105)  -- 'dd-mm-yyy'
SELECT CONVERT(varchar, GETDATE(), 111)  -- 'yyyy/mm/dd'
SELECT CONVERT(varchar, GETDATE(), 112)  -- 'yyyymmdd'


SELECT CONVERT(varchar,GETDATE(),108) 'hh:mm:ss'
SELECT CONVERT(varchar,GETDATE(),114) 'hh:mm:ss:mmm'
SELECT CONVERT(varchar,GETDATE(),113) 'dd Mmm yyyy hh:mm:ss:mmm'
SELECT CONVERT(VarChar(50), GETDATE(), 100) 'mmm dd yyyy mm:ss AM'

 

     и еще: