블로그 이미지
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

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. 7. 14. 14:41 MSSQL

Msg 325, Level 15, State 1, Line 9 Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

Why I’m getting this error?
The PIVOT command is not available for SQL Server 2000. When we upgrade the SQL Server 2000 instance to SQL Server 2005, the database COMPATIBILITY_LEVEL remain in 80 until we change it manually.

Solution:

If you are running SQL 2005
EXEC sp_dbcmptlevel 'myDatabaseName', 90

If you are running SQL 2008
EXEC sp_dbcmptlevel 'myDatabaseName', 100

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. 12. 7. 11:24 MSSQL

SQL Azure를 사용해 보신 분들을 아시겠지만,
Server Explorer에 SQL Azure DB가 등록이 안됩니다.

아마도 Visual Studio 2010 정식 버전 나오고 나면, Azure SDK 등에서 기본으로 지원할지도 모르겠지만,
현재는 어떤 능자가 구현해 놓은 SQL Azure Explorer를 통해서 VS2010 Beta에서 손쉽게
SQL Azure DB를 사용하실 수 있습니다.

다운로드

최신버전을 아래 링크에서 다운로드 받으실 수 있습니다.
http://sqlazureexplorer.codeplex.com/


사용법

다운로드하시면 확장자가 vsix인 파일입니다.
이것은 VS2010에서부터 지원하는 Add-in 포맷입니다.
MEF(Managed Extensibility Framework)를 공부하시면 손쉽게 만들 수 있다고 하니,
관심있으신 분들은 고고씽!

일단 설치가 되었으면, Visual Studio 2010에서 [Tools-SQL Azure Explorer]를 실행합니다.



그러면 작은 창 하나가 생깁니다.



사이드에 있는 다른 Explorer들과 사이좋게 지내라고 잘 Docking 시킵니다.
그리고 상단 CommandBar를 보시면 Connection Properties란 것이 있습니다.
클릭하세요!



그러면 Connection Property들을 입력할 수 있는 창이 뜹니다.



여기 입력하는 정보들은 Window Azure 포탈의 SQL Azure 탭에서 확인하실 수 있습니다. 



여기서 Login 아이디 적을 때에 주의하셔야 할 점은 위 그림의 빨간 숫자를 잘 봐주세요.
username@servername으로 입력해 주셔야 하는데 [2번]@[1번] 이렇게 입력해 주시면 됩니다.
다 입력하셨으면 확인 버튼을 꾸욱!

주의) 접속이 안되면서 IP 주소를 운운하는 경우는 SQL Azure에서 Firewall 설정에
본인의 IP가 허가되지 않은 경우이니 Add Rule을 통해 추가하세요.




그러면 아래처럼 SQL Azure의 DB와 User 정보를 읽어오면서 사용이 가능한 상태가 됩니다.



아직 기능들 중 GUI를 지원하는 것들이 별로 없어서 강력하지는 않지만, 점점 강력해지겠죠.
현재는 데이터 조회정도의 용도로 사용하면 좋습니다.

강력한 관리를 위해서는 SQL Server 2008 R2 November CTP에 포함되어 있는 
SQL Server Management Studio를 사용하시면 됩니다.

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
prev 1 2 3 4 next