특정 SP 검색
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+'%'
특정 SP 검색
결과값에 자리수를 표시하는 방법(Money)
----------------
결과값
100,000,000.00
----------------
결과값
100,000,000
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
기본적으로 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; GOSelect *
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 스프레드시트를 액세스하는 연결된 서버를 만들려면 다음 예와 같은 형식을 사용하십시오.
Excel 스프레드시트의 데이터를 액세스하려면 셀 범위에 이름을 연결하십시오. 범위 이름을 테이블 이름으로 사용하여 명명된 범위를 액세스할 수 있습니다. 다음 쿼리를 사용하면 이전 예제에서 만든 연결된 서버를 사용하여 SalesData라는 명명된 범위를 액세스할 수 있습니다.
명명된 셀 범위에 행을 삽입하면 명명된 셀 범위의 일부인 마지막 행 다음에 이 행이 추가됩니다. 따라서 열 머리글 뒤에
rA 행을 삽입하려면 열 머리글 셀을 이름과 연결한 다음 이 이름을 테이블 이름으로 사용하십시오. 행이 삽입되면
셀 범위가 자동으로 증가합니다.
-- 테이블 목록
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
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":
Here is the output from the above code when run on my machine:
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'
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