블로그 이미지
Sunny's

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2012. 4. 23. 17:42 MSSQL

 

특정 SP 검색

 

 

 Declare @SP_NAME varchar(1000)
 Declare @DS_TEXT varchar(1000)
 Set @SP_NAME = 'order'
 Set @DS_TEXT = 'order'
 
 Select A.name, b.text, *
 From sysobjects a, syscomments b
 Where a.id=b.id
 And a.name like '%'+@SP_NAME+'%'
 And b.text like '%'+@DS_TEXT+'%'

 

 

 

posted by Sunny's
2012. 4. 23. 17:25 MSSQL

 

결과값에 자리수를 표시하는 방법(Money)

 

 select convert(varchar, convert(money, 100000000), 1)

 

 ----------------

  결과값

  100,000,000.00


 select Replace(convert(varchar, convert(money, 100000000), 1), '.00','')

----------------

 결과값

100,000,000

 

 

posted by Sunny's
2012. 3. 19. 10:04 MSSQL

With Tree_Org(self_cd, parent_cd, name, org_level, sort_col)

AS

(

Select self_cd, parent_cd, name, 1 As Org_Level, Convert(varchar(255), self_cd)

From tbl_relation

Where self_cd = '01'

Union All

Select a.self_cd, a.parent_cd, a.name, b.org_level + 1 As org_level, Convert(varchar(255), sort_col + ' ' + a.self_cd)

From tbl_relation A

Inner Join Tree_Org B On A.parent_cd = B.self_cd

)

Select self_cd, parent_cd, name, org_level, sort_col

From Tree_Org

order by sort_col

오라클에서는 Connect by를 써서 나타내지만 Mssql에서는 2005부터 CTE로 기능을 제공한다.

붉게 표시된 부분은 특정 컬럼을 연결하여 마지막 조회시 연결된 컬럼으로 sort하게되며 계층형태로 조회된다.

출처 : http://blog.naver.com/PostView.nhn?blogId=kwonhjae&logNo=30039692894

[출처] MS-SQL 2005 계층구조|작성자 Gabriel


posted by Sunny's
2011. 5. 27. 13:39 MSSQL

SQL Unpluged : 300

posted by Sunny's
2011. 2. 1. 14:48 MSSQL
출처 : http://msdn.microsoft.com/ko-kr/library/ms187569.aspx

기본적으로 SQL Server에서는 OPENROWSET 및 OPENDATASOURCE를 사용하는 임시 분산 쿼리를 허용하지 않습니다. 이 옵션을 1로 설정하면 SQL Server에서 임시 액세스가 허용됩니다. 이 옵션을 설정하지 않거나 0로 설정하면 SQL Server에서 임시 액세스가 허용되지 않습니다.

임시 분산 쿼리에서는 OPENROWSET 및 OPENDATASOURCE 함수를 사용하여 OLE DB를 사용하는 원격 데이터 원본에 연결합니다. OPENROWSET과 OPENDATASOURCE는 자주 사용되지 않는 OLE DB 데이터 원본을 참조하기 위해서만 사용해야 합니다. 여러 번 액세스될 모든 데이터 원본에 대해서는 연결된 서버를 정의해야 합니다.

보안 정보 보안 정보

임시 이름 사용을 설정하면 SQL Server에 대한 모든 인증된 로그인에서 공급자에 액세스할 수 있습니다. SQL Server 관리자는 모든 로컬 로그인에서 액세스해도 안전한 공급자에 대해 이 기능을 설정해야 합니다. 자세한 내용은 외부 데이터 액세스DisallowAdhocAccess 옵션을 참조하십시오.

다음 예에서는 임시 분산 쿼리를 실행한 다음 OPENROWSET 함수를 사용하여 Seattle1이라는 서버를 쿼리합니다.

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
     'SELECT GroupName, Name, DepartmentID
      FROM AdventureWorks2008R2.HumanResources.Department
      ORDER BY GroupName, Name') AS a;
GO
 
Select * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0 Xml;HDR=YES;Database=d:\파일명.xls',
    'SELECT * FROM [sheet$]')
Select * 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;HDR=YES;Database=d:\파일명.xls',
'select * from [sheet$]');
















Excel 스프레드시트에 대해 연결된 서버를 만들려면

Jet 4.0용 Microsoft OLE DB 공급자를 사용하여 Microsoft Excel 스프레드시트에 액세스할 수 있습니다.

  • Excel 스프레드시트를 액세스하는 연결된 서버를 만들려면 다음 예와 같은 형식을 사용하십시오.

    EXEC sp_addlinkedserver EXCEL,
    'Jet 4.0',
    'Microsoft.Jet.OLEDB.4.0',
    'c:\data\MySheet.xls',
    NULL,
    'Excel 5.0;'
    GO
  • Excel 스프레드시트의 데이터를 액세스하려면 셀 범위에 이름을 연결하십시오. 범위 이름을 테이블 이름으로 사용하여 명명된 범위를 액세스할 수 있습니다. 다음 쿼리를 사용하면 이전 예제에서 만든 연결된 서버를 사용하여 SalesData라는 명명된 범위를 액세스할 수 있습니다.

    SELECT * FROM EXCEL...SalesData
    GO





명명된 셀 범위에 행을 삽입하면 명명된 셀 범위의 일부인 마지막 행 다음에 이 행이 추가됩니다. 따라서 열 머리글 뒤에 rA 행을 삽입하려면 열 머리글 셀을 이름과 연결한 다음 이 이름을 테이블 이름으로 사용하십시오. 행이 삽입되면 셀 범위가 자동으로 증가합니다.

posted by Sunny's
2011. 1. 21. 11:40 MSSQL

OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

idoc

XML 문서의 내부 표시 문서 핸들입니다. XML 문서의 내부 표시는 sp_xml_preparedocument를 호출하여 만듭니다.

rowpattern

idoc 매개 변수로 핸들을 전달하는 XML 문서에서 행으로 처리될 노드를 나타내기 위해 사용하는 XPath 패턴입니다.

flags

XML 데이터와 관계형 행 집합 사이에 사용해야 하는 매핑과 남는 열을 채우는 방법을 나타냅니다. flags는 선택적 입력 매개 변수이며 다음 값 중 하나가 될 수 있습니다.

바이트 값

설명

0

기본적으로 특성 중심 매핑을 사용합니다.

1

특성 중심 매핑을 사용합니다. XML_ELEMENTS와 결합할 수 있습니다. 이 경우 특성 중심 매핑이 먼저 적용된 다음 아직 처리되지 않은 모든 열에 대해 요소 중심 매핑이 적용됩니다.

2

요소 중심 매핑을 사용합니다. XML_ATTRIBUTES와 결합할 수 있습니다. 이 경우 특성 중심 매핑이 먼저 적용된 다음 아직 처리되지 않은 모든 열에 대해 요소 중심 매핑이 적용됩니다.

8

XML_ATTRIBUTES 또는 XML_ELEMENTS와 결합(논리적 OR 연산을 수행)할 수 있습니다. 검색 상황에서 이 플래그는 소비된 데이터를 오버플로 속성인 @mp:xmltext로 복사할 수 없음을 나타냅니다.

SchemaDeclaration

다음 형식의 스키마 정의입니다. ColNameColType [ColPattern | MetaProperty] [,ColNameColType [ColPattern | MetaProperty]...]

ColName

행 집합의 열 이름입니다.

ColType

행 집합에 있는 열의 SQL Server 데이터 형식입니다. 열 형식이 특성의 기본 xml 데이터 형식과 다른 경우에는 형식 강제 변환이 발생합니다.

ColPattern

선택 사항이며 XML 노드를 열에 매핑하는 방법을 설명하는 일반 XPath 패턴입니다. ColPattern을 지정하지 않은 경우에는 기본 매핑(flags에 의해 지정된 특성 중심 또는 요소 중심 매핑)이 사용됩니다.

ColPattern으로 지정된 XPath 패턴은 flags에 의해 지정된 기본 매핑을 개선하거나 덮어쓰도록 매핑(특성 중심요소 중심 매핑)의 특성을 지정하는 데 사용합니다.

ColPattern으로 지정된 일반 XPath 패턴은 메타 속성도 지원합니다.

MetaProperty

OPENXML이 제공하는 메타 속성 중 하나입니다. MetaProperty를 지정한 경우 열에 메타 속성이 제공하는 정보가 포함됩니다. 메타 속성을 통해 상대적 위치 및 네임스페이스 정보 등 XML 노드에 대한 정보를 추출할 수 있습니다. 텍스트 형태로 표시되는 것보다 많은 정보를 제공합니다.

TableName

원하는 스키마가 있는 테이블이 이미 존재하고 열 패턴이 필요하지 않을 때 SchemaDeclaration 대신 지정할 수 있는 테이블 이름입니다.


예제)
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity')

결과..
OrderID CustomerID           OrderDate                 ProdID    Qty
------------------------------------------------------------------------
10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3


XML Element 의 접근은 ../OrderDetail 로 접근





posted by Sunny's
2010. 12. 17. 09:23 MSSQL

-- 테이블 목록
EXEC SP_TABLES

 

-- 테이블이 컬럼 목록

EXEC SP_COLUMNS @TABLE_NAME

 

-- 스키마 테이블에서 직접 컬럼정보 가져오기~

SELECT  *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME

 

-- PK, FK, INDEX등 정보 가져오기

SELECT  *

FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS K
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS C ON K.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE K.TABLE_NAME = @TABLE_NAME

 

-- 컬럼에 추가해둔 Description 가져오기

SELECT  *
FROM SYS.EXTENDED_PROPERTIES XP 
WHERE XP.CLASS = 1
 AND  XP.MINOR_ID > 0
 AND XP.MAJOR_ID = OBJECT_ID(@TABLE_NAME) 
 AND XP.NAME IN (N'MS_DESCRIPTION'
ORDER BY XP.MINOR_ID

 

위의 정보를 이용하여 테이블 정보를 출력해 보자~

프로젝트 산출물 작업시 유용하게 쓰일것이다. 

 

포맷이 다음과 같다면...

컬럼 명 컬럼 ID Type & Length NOT
NULL
PK FK IDX 비고
               
               
               
               

 

DECLARE @TABLE_NAME AS VARCHAR(30)

SET @TABLE_NAME = 'TEM_BOARD'

 

SELECT

         [컬럼명] = D.COLUMN_DESC

       , [컬럼ID] = C.COLUMN_NAME

       , [Type & Length] = COLUMN_TYPE

       , [NOT NULL] = CASE WHEN C.IS_NULLABLE = 'NO' THEN 'Y' ELSE '' END

       , PK = ISNULL(K.PK, '')

       , FK = ISNULL(K.FK, '')

       , INX = ISNULL(K.INX, '')

FROM

(

 SELECT 

    TABLE_NAME

  , COLUMN_NAME

  , IS_NULLABLE

  , COLUMN_TYPE = CASE WHEN DATA_TYPE IN ('VARCHAR', 'NVARCHAR', 'char', 'nchar') THEN

       DATA_TYPE + '(' + CONVERT(VARCHAR(10), ISNULL(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION)) + ')'

      WHEN DATA_TYPE IN ('DECIMAL') THEN

       DATA_TYPE + '(' + CONVERT(VARCHAR(10), NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR(10), NUMERIC_SCALE) + ')'      

      ELSE DATA_TYPE END

  , ORDINAL_POSITION

 FROM INFORMATION_SCHEMA.COLUMNS

 WHERE TABLE_NAME = @TABLE_NAME

) AS C

LEFT JOIN -- 키정보

(

       SELECT COLUMN_NAME

             , PK = MAX(PK)

             , FK = MAX(FK)

             , INX = MAX(INX)

       FROM

       (

             SELECT

                      COLUMN_NAME

                    , PK = CASE WHEN K.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 'Y' END

                    , FK = CASE WHEN K.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 'Y' END

                    , INX = CASE WHEN K.CONSTRAINT_TYPE = 'INDEX' THEN 'Y' END

              FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS K

                    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS C ON K.CONSTRAINT_NAME = C.CONSTRAINT_NAME

              WHERE K.TABLE_NAME = @TABLE_NAME

       ) AS K

       GROUP BY COLUMN_NAME

) AS K ON C.COLUMN_NAME = K.COLUMN_NAME

LEFT JOIN -- Description 정보

(

 SELECT

    COLUMN_NM = COL_NAME(XP.MAJOR_ID, XP.MINOR_ID) 

  , COLUMN_DESC = CAST(XP.[VALUE] AS NVARCHAR(4000))

 FROM SYS.EXTENDED_PROPERTIES XP 

 WHERE XP.CLASS = 1

  AND  XP.MINOR_ID > 0

  AND XP.MAJOR_ID = OBJECT_ID(@TABLE_NAME) 

  AND XP.NAME IN (N'MS_DESCRIPTION') 

) AS D ON C.COLUMN_NAME = D.COLUMN_NM

ORDER BY C.ORDINAL_POSITION

 


posted by Sunny's
2010. 8. 19. 09:19 MSSQL

SQL Server 관리 시에 sysobjects 를 많이 이용하는데, 다음 두 가지 Procedure를 배우게 되면, 아주 쉽게 관리할 수 있겠더군요.


sp_MSforeachtable : 현재 사용중인 DB의 모든 table을 열거합니다.

예 : EXEC sp_MSforeachtable 'DBCC CLEANTABLE(''Northwind'', ''?'')'

sp_MSforeachdb : 현재 연결된 DB서버의 모든 Database를 열거합니다.

예 : EXEC sp_MSforeachdb 'DBCC CHECKDB (''?'')'



Here is my code for getting the row counts for each table in a database using a CURSOR:


use pubs
go
set nocount on

declare @cnt int

declare @table varchar(128)
declare @cmd varchar(500)
create table #rowcount (tablename varchar(128), rowcnt int)
declare tables cursor for








select table_name from information_schema.tables
where table_type = 'base table'
open tables fetch next from tables into @table
while @@fetch_status = 0
begin
set @cmd = 'select ''' + @table + ''', count(*) from ' + @table
insert into #rowcount exec (@cmd)
fetch next from tables into @table
end CLOSE tables
DEALLOCATE tables


select top 5 * from #rowcount

order by tablename

drop table #rowcount







     

Here is the output of my CURSOR example when the above code in run on my machine:

tablename rowcnt ------------- ----------- authors 23 discounts 3 employee 43 jobs 8 pub_info 8









 

Now here is my code that produces similar results using the undocumented SP_MSforeachtable": 

use pubs
go
create table #rowcount (tablename varchar(128), rowcnt int)
exec sp_MSforeachtable
   'insert into #rowcount select ''?'', count(*) from ?'
select top 5 * from #rowcount
    order by tablename
drop table #rowcount


Here is the output from the above code when run on my machine:

tablename         rowcnt     
----------------- -----------
[dbo].[authors]   23
[dbo].[discounts  3
[dbo].[employee]  43
[dbo].[jobs]      14
[dbo].[pub_info]  8
 
posted by Sunny's
2010. 6. 15. 13:44 MSSQL
MSSQL의 시스템 테이블에는 여러가지 정보가  담겨져 있습니다.  예를  들어서 테이블의 카운트를 구하기구하기 위해서는 count() 함수를함수를 이용하는것이 일반적입니다.

 

ex)

--count() 함수를 이용한이용한 테이블의 COUNT정보

select count(*) from TABLE_NAMETABLE_NAME

go

 

하지만 데이터 베이스의베이스의 모든 테이블의 카운트 정보를 알고 싶다면 이렇게 한 테이블씩 카운트를 한다면한다면 무척이나 시간이 걸릴것 입니다. 그러나 시스템 정보 테이블을 이용한다면이용한다면 한번의 쿼리로 데이터베이스 상의 모든 테이블의 카운트를 구할 수 있습니다..

 

ex)

--시 스템 테이블을 이용한 각 테이블의 COUNT정보
select o.name as TABLE_NAME, i.rows as ROW_COUNT_ALL
from sysindexes i, sysobjects o
where o.xtype = 'U'
and o.name <> 'sysdiagrams'
and o.id = i.id
order by o.name
go

 

이렇게 구하면 아무리 많은 양의 레코드를 가진 테이블이라 할 지라도지라도 count()함수 보다 월등히 빠른 속도로 카운트 정보를 가져올 수수 있습니다.  설명은 간단히 끝내고 몇가지 유용한 시스템 테이블 정보를정보를 소개 하겠습니다.

 

--특정 저장 프로시져의 내용정보

select o.name,c.texto.name,c.text from syscomments c , sysobjects o
where c.id = o.id
and o.name = 'SP_NAME'
order by c.id,c.colid

go

 

--뷰 를 작성한 SELECTSELECT 문장 정보

select o.name,c.text from syscomments cc , sysobjects o
where c.id = o.id
and o.name = 'VIEW_NAME'VIEW_NAME
order by c.id,c.colid

go

 

--특정 테이블의 컬럼 정보
select o.name,c.name
from syscolumns c, sysobjects o
where c.id=o.id
andand o.name = TABLE_NAME

go

 

--특정 테이블의 인덱스 정보
select o.name,col.name
from sysindexkeys ik, sysobjects o, syscolumns c,c,
   (select i.id,i.indid,i.status
    from sysindexes i
     where (i.status & 2048)<>0) sub_i
where ik.id=o.id
and ik.id=c.id
andand ik.colid=c.colid
and ik.id=sub_i.id
and ik.indid=sub_i.indid
and o.name='TABLE_NAME'
order by ik.id,ik.indid,ik.keynoik.id,ik.indid,ik.keyno

go

 

--현재 서버상에  존재하는 프로세서 정보

selectselect
spid,kpid,lastwaittype,status,hostname,program_name
from master..sysprocesses

go

 

--특정일 이후에 작성된 오브젝트 객체만을 알고알고 싶을때

select o.name table_name, substring(v.name + x.name,1,16)x.name,1,16) type , o.crdate create_date

,substring(user_name(uid),1,8) owner
from sysobjects o, master.dbo.spt_values v, master.dbo.spt_values x
where o.sysstat & 0xf = v.number
and v.type = 'O'
and x.type = 'R'
and o.userstat && -32768 = x.number
and o.crdate >= 'DATE_BASE'

order by 4,2,3,1

go

 

--현 재 트랜잭션 락 현상을 일으키는 세션정보와 대상대상 오브젝트 정보

select  convert (smallint, req_spid) spid,spid,
rsc_dbid dbid,rsc_objid objId,o.name objname,rsc_indid IndId,
substring (v.name, 1, 4) type,substring (rsc_text,(rsc_text, 1, 16) resource,
substring (u.name, 1, 8) mode,substring (x.name, 1, 5)5) status
from master.dbo.syslockinfo,master.dbo.sysobjects o,
master.dbo.spt_values v,master.dbo.spt_values x,
master.dbo.spt_values u
where master.dbo.syslockinfo.rsc_type = v.number
and master.dbo.syslockinfo.rsc_objid *= o.id and v.type = 'LR'
and master.dbo.syslockinfo.req_status = x.number and x.type = 'LS'
andand master.dbo.syslockinfo.req_mode + 1 = u.number and u.type = 'L'
order byby spid

go

 

--테이블의 인덱스를 강제로 타게 만들기

select * from TABLE_NAME tablename WITH(INDEX(PK_NAME))
where tablename.empno = 1
gogo



-- 테이블의 P key를 알고 싶을때
sp_pkeys TABLE_NAME


-- 프로시저의 내용이나, 뷰의 내용을 간단히 알고싶을때
sp_helptext 프로시저명

참조 사이트 : http://jajking.textcube.com/30

posted by Sunny's
2010. 6. 8. 09:51 MSSQL
SQL 메일을 사용하면 Microsoft SQL Server에서 손쉽게 전자 메일을 보내거나 읽을 수 있지만 SQL 메일이 MAPI 응용 프로그램이므로 서버에 MAPI 하위 시스템이 있어야 합니다. Microsoft Windows NT 4.0에서는 Windows Messaging을 설치할 때 MAPI 하위 시스템이 설치됩니다. 그러나 Microsoft Windows 2000에서는 MAPI 하위 시스템이 제공되지 않습니다. 따라서 SQL 메일을 사용하려면 Microsoft Outlook과 같은 MAPI 클라이언트를 설치해야 합니다.

SQL Server에서 직접 SMTP(Simple Mail Transfer Protocol) 전자 메일을 보내는 다른 방법을 사용할 수 있습니다. 예를 들어 CDONTS(NT Server용 Collaboration Data Objects)나 CDOSYS(Windows 2000용 Collaboration Data Objects)를 sp_OA SQL Server OLE 자동화 저장 프로시저와 함께 사용할 수 있습니다. 이 문서에서는 이러한 기술을 사용하여 인터넷 메일 서버에 전자 메일을 보내는 방법을 예제를 통해 설명합니다. 이러한 기술을 수정하여 보다 강력한 메일 시스템을 구축할 수도 있습니다. 예를 들어 오류 처리 코드를 추가할 수 있습니다. 이 예제에 사용된 방법으로는 전자 메일을 읽거나 처리할 수 없습니다.

참고 이러한 프로그래밍 예제는 Transact-SQL에서 CDO 개체 모델을 호출하는 데 사용할 수 있는 기술을 보여 줍니다. 이러한 예제를 프로그래밍 방식으로 확장하거나 프로덕션 환경에서 코드를 실행하는 데 필요한 스트레스 테스트를 수행할 책임은 사용자에게 있습니다.

Microsoft는 모든 보증(상품, 특정 목적에 대한 적합성 및 비침해에 대한 묵시적인 보증을 포함하며 이에 제한되지 않음)을 배제하며 예를 보여 주기 위한 목적으로만 이 프로그래밍 예제를 제공합니다. 본 문서의 내용은 프로시저를 작성하고 디버깅하는 데 사용되는 도구 및 여기서 설명하는 프로그래밍 언어에 익숙한 사용자를 대상으로 합니다. Microsoft 기술 지원 담당자는 사용자에게 도움이 되도록 특정 절차에 대한 기능을 설명할 수 있지만 사용자의 특정 요구 사항에 맞도록 예제를 수정하여 추가 기능을 제공하거나 절차를 구성하지는 않습니다. 프로그래밍에 익숙하지 않은 사용자는 MCP(Microsoft Certified Partner)의 도움을 받거나 Microsoft 고객기술지원부(02-508-0040)로 문의하십시오. MCP에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
https://solutionfinder.microsoft.com/ (https://solutionfinder.microsoft.com/)
Microsoft에서 제공하는 지원 서비스에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
기술지원 서비스 안내 (http://support.microsoft.com/default.aspx?scid=fh;ko;serviceoverview)

Microsoft Windows NT Server용 CDO(CDONTS)를 사용하는 방법

CDONTS는 웹 기반 응용 프로그램에 메시징 기능을 제공하는 SMTP 전용 OLE 서버이므로, HTML 기반 전자 메일을 보내는 기능을 지원합니다. SQL 메일과 같은 MAPI 기반 응용 프로그램은 이러한 기능을 지원하지 않습니다. Microsoft Internet Information Server(IIS) 4.0 이상에서는 기본적으로 CDONTS가 설치됩니다. Microsoft Windows 2000에서는 기본적으로 Microsoft Internet Information Server(IIS) 5.0이 설치됩니다.

CDONTS에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
177850  (http://support.microsoft.com/kb/177850/ ) INFO: CDO 1.2와 CDONTS의 차이점


CDONTS는 SMTP를 통해 로컬 서버에 전자 메일을 보냅니다. 로컬 서버에 SMTP 서버가 없으면 IIS에서 설치한 SMTP 가상 서버를 사용하여 SMTP 전자 메일을 해당 SMTP 메일 서버로 라우팅할 수 있습니다. CDONTS를 사용하여 SQL Server에서 전자 메일을 보내려면 다음과 같이 하십시오.

  1. SQL Server를 실행하는 컴퓨터에 IIS를 설치하여 실행합니다.
  2. IIS SMTP 서비스가 로컬 서버에 수신되는 모든 SMTP 전자 메일을 SMTP 메일 서버에 자동으로 라우팅하도록 SMTP 메일 서버를 "스마트 호스트"로 지정합니다.
  3. SQL Server에서 전자 메일을 보내는 데 사용할 수 있는 저장 프로시저를 만듭니다.
SQL 메일 대신 CDONTS를 사용할 때는 SQL Server를 실행하는 컴퓨터에 Microsoft Outlook과 같은 메일 클라이언트를 설치할 필요가 없으며 Microsoft Exchange 서버도 필요하지 않습니다. SMTP 전자 메일을 지원하는 모든 메일 서버를 "스마트 호스트"로 사용할 수 있습니다. 하지만 CDONTS를 사용하면 SQL Server를 실행하는 컴퓨터에 수신되는 전자 메일을 읽거나 처리할 수 없으며 SQL 에이전트 메일 기능을 대체할 수도 없습니다.

다음 방법에서는 Microsoft Windows 2000이 사용됩니다. 컴퓨터에 IIS 4.0이 설치되어 있으면 Microsoft Windows NT 4.0을 다음 방법과 비슷하게 구성할 수 있지만 절차가 약간 다릅니다.

Microsoft Windows NT 4.0에서 "스마트 호스트"를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
230235  (http://support.microsoft.com/kb/230235/ ) XCON: SMTP 메일을 릴레이하도록 IIS SMTP 서비스를 구성하는 방법


스마트 호스트 구성

  1. 시작을 누르고 프로그램, 관리 도구를 차례로 가리킨 다음
    인터넷 서비스 관리자를 눌러 IIS 관리자를 엽니다.
  2. 서버 트리를 엽니다. 기본 SMTP 가상 서버를 마우스 오른쪽 단추로 누른 다음 등록 정보를 누릅니다.
  3. 배달 탭으로 이동한 다음 고급을 누릅니다.
  4. 스마트 호스트 입력란에 SMTP 메일 서버의 이름을 입력합니다. SMTP 메일 서버의 이름을 모르면 메일 관리자에게 문의하십시오.
  5. SMTP 서비스가 실행되고 있는지 확인합니다. SMTP 서비스는 IIS 관리 서비스의 일부이므로 IIS 관리 서비스도 실행되고 있어야 합니다.

CDONTS 전자 메일을 보내는 저장 프로시저 만들기

참고 이 문서에 사용된 회사, 기관, 제품, 도메인 이름, 전자 메일 주소, 로고, 사람, 장소 및 이벤트 등은 실제 데이터가 아닙니다. 어떠한 실제 회사, 기관, 제품, 도메인 이름, 전자 메일 주소, 로고, 사람, 장소 또는 이벤트와도 연관시킬 의도가 없으며 그렇게 유추해서도 안됩니다.

다음과 유사한 코드를 사용하면 master 데이터베이스에서 SQL Server OLE 자동화 저장 프로시저로 CDONTS 개체 모델을 호출하여 전자 메일을 보내는 저장 프로시저를 만들 수 있습니다.

CREATE PROCEDURE [dbo].[sp_send_cdontsmail] 
@From varchar(100),
@To varchar(100),
@Subject varchar(100),
@Body varchar(4000),
@CC varchar(100) = null,
@BCC varchar(100) = null
AS
Declare @MailID int
Declare @hr int
EXEC @hr = sp_OACreate 'CDONTS.NewMail', @MailID OUT
EXEC @hr = sp_OASetProperty @MailID, 'From',@From
EXEC @hr = sp_OASetProperty @MailID, 'Body', @Body
EXEC @hr = sp_OASetProperty @MailID, 'BCC',@BCC
EXEC @hr = sp_OASetProperty @MailID, 'CC', @CC
EXEC @hr = sp_OASetProperty @MailID, 'Subject', @Subject
EXEC @hr = sp_OASetProperty @MailID, 'To', @To
EXEC @hr = sp_OAMethod @MailID, 'Send', NULL
EXEC @hr = sp_OADestroy @MailID

그런 다음 이 저장 프로시저를 사용하고 올바른 매개변수를 제공하십시오.
exec sp_send_cdontsmail 'someone@example.com','someone2@example.com','Test of CDONTS','It works'
참고sysadmin 고정 서버 역할의 구성원만이 OLE 자동화 저장 프로시저를 실행할 수 있습니다. SQL Server가 sysadmin 고정 서버 역할의 구성원이 아닐 경우 예제에 설명되어 있는 저장 프로시저를 사용하여 전자 메일을 보낼 수 없습니다. 이러한 상황에서는 CDONTS를 사용하여 전자 메일을 보내는 클라이언트 응용 프로그램을 개발해야 합니다. 예를 들어 Microsoft Visual Basic 응용 프로그램을 사용할 수 있습니다.

CDONTS는 SMTP 로컬 가상 서버에 전자 메일을 보냅니다. 그러면 서버는 스마트 호스트 입력란에 지정된 SMTP 메일 서버로 전자 메일을 라우팅합니다. SMTP 메일 서버는 To: 인수에 지정된 전자 메일 주소(이 예제의 경우 "someone2@example.com")로 메일을 보냅니다. From: 인수에 지정된 이름은
제목이 "Test of CDONTS"이고 메시지 본문이 "It works"인 전자 메일을 보낸 사람(이 예제의 경우 "someone@microsoft.com")으로 나타납니다. CC 또는 BCC 필드에는 인수를 제공하지 않았기 때문에 전자 메일이 아무에게도 복사되지 않습니다.

이 예제를 수정하여 HTML 기반 전자 메일이나 첨부 파일을 보낼 수 있습니다. CDONTS에 대한 문서를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.

http://msdn.microsoft.com/library (http://msdn.microsoft.com/library)

왼쪽 창에서 Messaging and Collaboration, Collaboration Data Objects, CDO 1.2.1을 차례로 확장하십시오.

SQL Server OLE 자동화 저장 프로시저에 대한 자세한 내용은 SQL Server 2000 온라인 설명서를 참조하십시오.

Microsoft Windows 2000용 CDO(CDOSYS)를 사용하는 방법

CDOSYS는 Microsoft Windows 2000에서 메시징 응용 프로그램을 개발하는 데 사용되는 개체 모델을 제공하고 기존의 CDONTS(Windows NT Server용 CDO) 라이브러리 기능을 향상시킵니다. CDOSYS를 사용하려면 Windows 2000과 로컬 또는 원격 SMTP 서버가 있어야 합니다.

프로그래밍 방식으로 SMTP 서버를 가리키도록 CDOSYS를 구성하여 개발자의 SMTP 서버 구성 작업에 대한 융통성을 높일 수 있습니다.

CDOSYS에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
195683  (http://support.microsoft.com/kb/195683/ ) INFO: 1.x CDO 라이브러리와 CDOSYS.DLL의 관계
CDOSYS가 원격 SMTP 서버에 전자 메일을 보낼 수 있으므로 SQL Server를 실행하는 컴퓨터에 Internet Information Server를 설치하여 실행할 필요가 없으며 SMTP 가상 서버를 구성할 필요도 없습니다. SQL Server에서 전자 메일을 보내는 데 사용할 수 있는 저장 프로시저를 만들기만 하면 됩니다.

SQL 메일 대신 CDOSYS를 사용할 때는 SQL Server를 실행하는 컴퓨터에 Microsoft Outlook과 같은 메일 클라이언트를 설치할 필요가 없으며 Exchange 서버도 필요하지 않습니다. SMTP 메일을 원격 SMTP 메일 서버로 지원하는 모든 메일 서버를 사용할 수 있습니다. 하지만 CDOSYS를 사용하면 SQL Server에 수신되는 전자 메일을 읽거나 처리할 수 없으며 SQL 에이전트 메일 기능을 대체할 수도 없습니다.

CDOSYS를 SQL Server OLE 자동화 개체와 함께 사용하면 SQL Server OLE 자동화를 통해 CDOSYS 개체 모델이 호출되는데, 이는 SQL Server 2000 서비스 팩 1(SP1)과 SQL Server 2000 서비스 팩 2(SP2)에서 테스트되었습니다. Microsoft는 SQL Server 2000 SP1 이전에 릴리스된 SQL Server 서버 버전에서 OLE 자동화 저장 프로시저로부터 CDOSYS를 호출할 수 있다고 보증하지 않습니다.



CDOSYS 메일을 보내는 저장 프로시저 만들기

다음과 유사한 코드를 사용하면 master 데이터베이스에서 SQL Server OLE 자동화 저장 프로시저로 CDOSYS 개체 모델을 호출하여 전자 메일을 보내는 저장 프로시저를 만들 수 있습니다.
CREATE PROCEDURE [dbo].[sp_send_cdosysmail] 
   @From varchar(100) ,
   @To varchar(100) ,
   @Subject varchar(100)=" ",
   @Body varchar(4000) =" "
/*********************************************************************

This stored procedure takes the parameters and sends an e-mail. 
All the mail configurations are hard-coded in the stored procedure. 
Comments are added to the stored procedure where necessary.
References to the CDOSYS objects are at the following MSDN Web site:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_messaging.asp

***********************************************************************/ 
   AS
   Declare @iMsg int
   Declare @hr int
   Declare @source varchar(255)
   Declare @description varchar(500)
   Declare @output varchar(1000)

--************* Create the CDO.Message Object ************************
   EXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUT

--***************Configuring the Message Object ******************
-- This is to configure a remote SMTP server.
-- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_schema_configuration_sendusing.asp
   EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'
-- This is to configure the Server Name or IP address. 
-- Replace MailServerName by the name or IP of your SMTP Server.
   EXEC @hr = sp_OASetProperty @iMsg, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', 'MailServerName' 

-- Save the configurations to the message object.
   EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null

-- Set the e-mail parameters.
   EXEC @hr = sp_OASetProperty @iMsg, 'To', @To
   EXEC @hr = sp_OASetProperty @iMsg, 'From', @From
   EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject

-- If you are using HTML e-mail, use 'HTMLBody' instead of 'TextBody'.
   EXEC @hr = sp_OASetProperty @iMsg, 'TextBody', @Body
   EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL

-- Sample error handling.
   IF @hr <>0 
     select @hr
     BEGIN
       EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
       IF @hr = 0
         BEGIN
           SELECT @output = '  Source: ' + @source
           PRINT  @output
           SELECT @output = '  Description: ' + @description
           PRINT  @output
         END
       ELSE
         BEGIN
           PRINT '  sp_OAGetErrorInfo failed.'
           RETURN
         END
     END

-- Do some error handling after each step if you have to.
-- Clean up the objects created.
   EXEC @hr = sp_OADestroy @iMsg
   go
그런 다음 이 저장 프로시저를 사용하고 올바른 매개변수를 제공하십시오.
   declare @Body varchar(4000)
   select @Body = 'This is a Test Message'
   exec sp_send_cdosysmail 'someone@example.com','someone2@example.com','Test of CDOSYS',@Body
참고sysadmin 고정 서버 역할의 구성원만이 OLE 자동화 저장 프로시저를 실행할 수 있습니다. SQL Server가 sysadmin 고정 서버 역할의 구성원이 아닐 경우 예제에 설명되어 있는 저장 프로시저를 사용하여 전자 메일을 보낼 수 없습니다. 이러한 상황에서는 CDOSYS를 사용하여 메일을 보내는 클라이언트 응용 프로그램을 개발해야 합니다. 예를 들어 Microsoft Visual Basic 응용 프로그램을 사용할 수 있습니다.

CDOSYS는 cdoSMTPServerName으로 지정된 원격 SMTP 메일 서버에 전자 메일을 보냅니다.

SMTP 메일 서버는 To: 인수에 지정된 전자 메일 주소(이 예제의 경우 "someone2@example.com")로 메일을 보냅니다. From: 인수에 지정된 이름은 제목이 "Test of CDONTS"이고
@sHTML 변수에 포함된 HTML 형식의 전자 메일을 보낸 사람(이 예제의 경우 "someone@microsoft.com")으로 나타납니다.

이 예제를 수정하여 텍스트 기반 전자 메일이나 첨부 파일을 보낼 수도 있습니다. CDOSYS에 대한 문서를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.

MSDN Library (http://msdn.microsoft.com/library)

참조 : http://support.microsoft.com/kb/312839/ko
posted by Sunny's
prev 1 2 3 4 next