레이블이 mssql인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mssql인 게시물을 표시합니다. 모든 게시물 표시

2011년 10월 11일 화요일

JOIN문을 이용한 UPDATE 쿼리


UPDATE T1
SET T1.P_CODE_VALUE1 = T2.P_CODE1
,T1.P_CODE_VALUE2 = T2.P_CODE2
FROM TMAST02TT T1
INNER JOIN TCODE02TT T2 ON T1.YEAR = T2.YEAR AND T1.P_CODE = T2.T_CODE
WHERE 1=1
AND T1.GUBUN = :gubun AND T1.YEAR = :year AND T1.SEASON = :season AND T1.SCHOOL = :school 
AND T1.BOKJONG = :bokjong AND T1.PUMOK = :pumok AND T1.SAYANG = :sayang AND T1.P_CODE = :pCode
AND T2.SEQ = :seq

2011년 8월 23일 화요일

MSSQL 요척 조회 함수


USE [skoolooks_erp]
GO
/****** Object:  UserDefinedFunction [dbo].[FN_GET_TCODE_YOCHUK]    Script Date: 08/23/2011 17:31:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,yskim>
-- Create date: <Create Date, ,20110804>
-- Description: <Description, , >

-- 요척계산 예외 (2011-08-22)
-- 1. 다음 조건을 만족할 경우
-- A. 복종이 스커트(S)
-- B. TCODE03TT.S_CODE_NAME='앞판'
-- C. TCODE01TT.CODE_NAME='주름종류' && TCODE01TT.CODE_NAME='주름수'
--
-- 2. TORDR02TT.P_CODE_VALUE1 값은 '주름종류'와 '주름수'에 해당하는 요척 값은 TGRUP01TT.YOCHUK 조회
-- A. TGRUP01TT.P_CODE1 = '주름종류'의 P_CODE_VALUE1
-- B. TGRUP01TT.P_CODE2 = '주름수'의 P_CODE_VALUE1

-- 3. 1의 조건에 해당하지 않거나 TORDR02TT.P_CODE_VALUE2 값은 기존 프로세스로 YOCHUK 값을 산정
-- =============================================
ALTER FUNCTION [dbo].[FN_GET_TCODE_YOCHUK]
(
@V_GUBUN VARCHAR(20)
, @V_YEAR VARCHAR(8)
, @V_SEASON VARCHAR(2)
, @V_SCHOOL VARCHAR(10)
, @V_BOKJONG VARCHAR(2)
, @V_PUMOK VARCHAR(2)
, @V_SAYANG VARCHAR(2)
, @V_CHASU VARCHAR(2)
)
RETURNS DECIMAL(3,2)
AS
BEGIN
-- Declare the return variable here
--DECLARE @ResultVar VARCHAR(4000)
DECLARE @ResultVar DECIMAL(3,2) = 0.00
DECLARE @PYochuk1 DECIMAL(3,2) = 0.00
DECLARE @PYochuk2 DECIMAL(3,2) = 0.00
DECLARE @PPCodeValue1 VARCHAR(100)
DECLARE @PPCodeValue2 VARCHAR(100)
DECLARE @PSCodeName VARCHAR(100)
DECLARE @PCodeName VARCHAR(100)

DECLARE @PCode1 VARCHAR(100) -- TGRUP01TT.P_CODE1
DECLARE @PCode2 VARCHAR(100) -- TGRUP01TT.P_CODE2
DECLARE @PGrupYochuk DECIMAL(3,2) = 0.00 -- TGRUP01TT.YOCHUK

-- Add the T-SQL statements to compute the return value here
DECLARE MY_CURSOR CURSOR FOR
SELECT
YOCHUK1, YOCHUK2
, P_CODE_VALUE1, P_CODE_VALUE2
, S_CODE_NAME, CODE_NAME
FROM (
SELECT
ISNULL((SELECT YOCHUK FROM TCODE02TT X WHERE X.YEAR=T1.YEAR AND X.T_CODE=T2.P_CODE AND X.P_CODE1=T2.P_CODE_VALUE1),0.00) AS YOCHUK1
, ISNULL((SELECT YOCHUK FROM TCODE02TT X WHERE X.YEAR=T1.YEAR AND X.T_CODE=T2.P_CODE AND X.P_CODE2=T2.P_CODE_VALUE2),0.00) AS YOCHUK2
, T2.P_CODE_VALUE1, T2.P_CODE_VALUE2
, T1.BOKJONG
, TC3.S_CODE, TC3.S_CODE_NAME
, TC1.CODE_NAME
, T2.P_CODE
FROM TORDR01TT T1
LEFT OUTER JOIN TORDR02TT T2
ON T1.GUBUN = T2.GUBUN AND T1.YEAR = T2.YEAR AND T1.SEASON = T2.SEASON AND T1.SCHOOL = T2.SCHOOL
AND T1.BOKJONG = T2.BOKJONG AND T1.PUMOK = T2.PUMOK AND T1.SAYANG = T2.SAYANG AND T1.CHASU=T2.CHASU
INNER JOIN TCODE03TT TC3 ON TC3.SEASON=SUBSTRING(T2.P_CODE,1,1) AND TC3.SEX=SUBSTRING(T2.P_CODE,2,1) AND TC3.BOKJONG=SUBSTRING(T2.P_CODE,3,1) AND TC3.S_CODE=SUBSTRING(T2.P_CODE,4,1)
INNER JOIN TCODE01TT TC1 ON TC1.YEAR=T2.YEAR AND TC1.T_CODE=T2.P_CODE
WHERE 1=1
AND T1.GUBUN = @V_GUBUN AND T1.YEAR = @V_YEAR AND T1.SEASON = @V_SEASON AND T1.SCHOOL = @V_SCHOOL
AND T1.BOKJONG = @V_BOKJONG AND T1.PUMOK = @V_PUMOK AND T1.SAYANG = @V_SAYANG AND T1.CHASU = @V_CHASU
) T1

OPEN MY_CURSOR;

FETCH NEXT FROM MY_CURSOR
INTO @PYochuk1, @PYochuk2, @PPCodeValue1, @PPCodeValue2, @PSCodeName, @PCodeName;

WHILE @@FETCH_STATUS = 0
BEGIN

IF @PSCodeName='앞판' AND @PCodeName='주름종류'
BEGIN
SELECT @PCode1 = @PPCodeValue1
END
ELSE IF @PSCodeName='앞판' AND @PCodeName='주름수'
BEGIN
SELECT @PCode2 = @PPCodeValue1
END
ELSE
BEGIN
SELECT @ResultVar = @ResultVar + @PYochuk1
END

SELECT @ResultVar = @ResultVar + @PYochuk2

FETCH NEXT FROM MY_CURSOR
INTO @PYochuk1, @PYochuk2, @PPCodeValue1, @PPCodeValue2, @PSCodeName, @PCodeName;
END;

SELECT @PGrupYochuk = ISNULL(YOCHUK, 0.00) FROM TGRUP01TT T1
WHERE T1.YEAR = @V_YEAR AND T1.BOKJONG = @V_BOKJONG AND P_CODE1=@PCode1 AND P_CODE2=@PCode2

CLOSE MY_CURSOR;
DEALLOCATE MY_CURSOR;

-- Return the result of the function
RETURN @ResultVar;

END

MSSQL 형변환 (CAST, CONVERT)

한 데이터 형식의 식을 다른 데이터 형식의 식으로 변환

syntax

CAST
CAST (expression AS data_type [ (length ) ] )

CONVERT
CONVERT (data_type [ (length ) ] ,expression [ ,style ] )





expression
유효한 입니다.
data_type
대상 데이터 형식입니다. xmlbigint 및 sql_variant가 있습니다. 별칭 데이터 형식은 사용할 수 없습니다. 사용 가능한 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오.
length
대상 데이터 형식의 길이를 지정하는 선택적 정수입니다. 기본값은 30입니다.
style
CONVERT 함수가 expression을 변환하는 방법을 지정하는 정수 식입니다. 스타일이 NULL이면 NULL이 반환됩니다. 범위는 data_type에 의해 결정됩니다. 자세한 내용은 주의 섹션을 참조하십시오.


data_type으로 변환된 expression을 반환합니다.


날짜 및 시간 스타일

expression이 날짜 또는 시간 데이터 형식이면 style은 다음 표에 있는 값 중 하나일 수 있습니다. 다른 값은 0으로 처리됩니다. SQL Server는 쿠웨이트 알고리즘을 사용하여 아랍어 스타일의 날짜 형식을 지원합니다.




번호출력값사용방법
0Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
102/22/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
206.02.22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
322/02/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
422.02.06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
522-02-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
622 Feb 06CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7Feb 22, 06CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8)
9Feb 22 2006 4:26:08:020PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
1002-22-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
1106/02/22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12060222CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
1322 Feb 2006 16:26:08:020CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
1416:26:08:037CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
212006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
2202/22/06 4:26:08 PMCONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
232006-02-22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
2416:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
252006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
10102/22/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
1022006.02.22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
10322/02/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
10422.02.2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
10522-02-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
10622 Feb 2006CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107Feb 22, 2006CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
10816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109Feb 22 2006 4:26:08:067PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
11002-22-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
1112006/02/22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
11220060222CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
11322 Feb 2006 16:26:08:067CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
11416:26:08:067CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
1202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
1212006-02-22 16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
1262006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
1272006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
13024 ???? 1427 4:26:08:080PMCONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
13124/01/1427 4:26:08:080PMCONVERT(CHAR(25), CURRENT_TIMESTAMP, 131)

2011년 8월 3일 수요일

[MSSQL] 프로시저 생성 샘플코드

기본 프로시저

프로시저 생성


  1. CREATE [or ALTER] PROCEDURE SP_SQUTY12PL
  2. @year nvarchar(8)
  3. , @season nvarchar(2)
  4. , @returnVal nvarchar(2000) OUTPUT
  5. AS
  6. BEGIN
  7. DECLARE
  8. @sql NVARCHAR(2000)
  9. set @sql = ' select * from squty02tt'
  10. set @returnVal = @sql
  11. END


프로시저 실행


  1. DECLARE @year nvarchar(8)
  2. DECLARE @season nvarchar(2)
  3. DECLARE @returnVal nvarchar(2000)
  4. set @year = '2012'
  5. set @season = 'F'
  6. exec dbo.SP_SQUTY12PL @year, @season, @returnVal OUTPUT
  7. select @returnVal


동적쿼리를 이용한 프로시저

  1. ALTER PROCEDURE SP_SQUTY12PL
  2. @year nvarchar(8)
  3. , @season nvarchar(2)
  4. AS
  5. BEGIN
  6. DECLARE
  7. @sql nvarchar(4000)
  8. , @param nvarchar(400)
  9. , @yy1 nvarchar(4)
  10. , @yy2 nvarchar(4)
  11. , @yy3 nvarchar(4)
  12. set @param = '@p_year nvarchar(8)
  13. , @p_season nvarchar(2)
  14. '
  15. set @sql = ' select top 20 * from squty02tt
  16. where year = @p_year and season = @p_season
  17. '
  18. --set @returnVal = @sql
  19. exec SP_EXECUTESQL @sql, @param, @p_year=@year, @p_season=@season
  20. END


execute procedure
  1. DECLARE @year nvarchar(8)
  2. DECLARE @season nvarchar(2)
  3. set @year = '2012'
  4. set @season = 'F'
  5. exec dbo.SP_SQUTY12PL @year, @season

[MSSQL] 컬럼 코멘트 조회 쿼리

 SELECT * FROM (
select  b.name ColumnName, c.name TypeName, b.length ColumnLength
, Case b.IsNullable when 1 then '' else 'NN' end Nullable
, Case When g.name is null Then '' Else 'PK' End PKwithCidx
, IsNull(d.value,'') Caption
from EVENT..sysobjects a
JOIN EVENT..syscolumns b ON (a.id = b.id and a.type='U' and a.status > 0 and a.name='TBL_MAIL_INFO')
JOIN EVENT..systypes c ON (b.xtype = c.xtype and c.name<>'sysname')
LEFT JOIN EVENT..sysproperties d ON  (b.id=d.id and b.colid = d.smallid)
LEFT JOIN (select name,e.id,colid from EVENT..sysindexes e join EVENT..sysindexkeys f on e.id=f.id
where e.id > 10000000 and e.indid=1 and f.indid=1) g ON (g.id=b.id and g.colid=b.colid)
--order by a.name, colorder
) X
WHERE ColumnName = 'MAIL_SEQ'



SQLServer 2008 버전에선 아래와 같이

SELECT 
*
FROM INFORMATION_SCHEMA.COLUMNS T1 
LEFT OUTER JOIN ( 
 SELECT 
 T.NAME TABLE_NAME, TD.VALUE TABLE_DESC 
 , C.NAME COLUMN_NAME, CD.VALUE COLUMN_DESC 
 FROM SYSOBJECTS T 
 INNER JOIN SYSUSERS U ON U.UID = T.UID 
 LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES TD ON TD.MAJOR_ID = T.ID AND TD.MINOR_ID = 0 AND TD.NAME = 'MS_Description' 
 INNER JOIN SYSCOLUMNS C ON C.ID = T.ID  
 LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES CD ON CD.MAJOR_ID = C.ID AND CD.MINOR_ID = C.COLID AND CD.NAME = 'MS_Description' 
 WHERE T.TYPE = 'u' 
) T2 ON T2.TABLE_NAME=T1.TABLE_NAME AND T2.COLUMN_NAME=T1.COLUMN_NAME 
WHERE T1.TABLE_NAME = ?
ORDER BY ORDINAL_POSITION 



[MSSQL] 테이블 컬럼조회 쿼리

-- 테이블 리스트 
SELECT * FROM INFORMATION_SCHEMA.TABLES
;

-- 컬럼 상세 정보 
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SQUTY02TT'
ORDER BY 5
;

[MSSQL] 서브쿼리를 문자열로 합치기 (using xml path)

SELECT
  ',' + CODE_NAME
  FROM TCODE01TT T1
  WHERE SEX = 'M' AND BOKJONG = 'J' AND S_CODE = '1'
  FOR XML PATH('')

[MSSQL] 동적쿼리를 이용한 프로시저


프로시저 소스

  1. ALTER PROCEDURE SP_SQUTY12PL_WITH_OLD_000
  2. @year nvarchar(8)
  3. , @season nvarchar(2)
  4. , @area nvarchar(2)
  5. , @agent nvarchar(10)
  6. , @bokjong nvarchar(8)
  7. AS
  8. BEGIN
  9. DECLARE
  10. @sql nvarchar(4000)
  11. , @param nvarchar(400)
  12. , @yyyyMinus1 nvarchar(8)
  13. , @yyMinus1 nvarchar(4)
  14. , @yyMinus2 nvarchar(4)
  15. , @yyMinus3 nvarchar(4)
  16. , @yySeason nvarchar(6)
  17. set @param = '@p_year nvarchar(8)
  18. , @p_season nvarchar(2)
  19. , @p_area nvarchar(2)
  20. , @p_agent nvarchar(2)
  21. , @p_yyyyMinus1 nvarchar(8)
  22. , @p_yyMinus1 nvarchar(4)
  23. , @p_yyMinus2 nvarchar(4)
  24. , @p_yyMinus3 nvarchar(4)
  25. , @p_yySeason nvarchar(6)
  26. , @p_bokjong nvarchar(8)
  27. '
  28. set @yySeason = substring(@year, 3, 2) + @season
  29. set @yyyyMinus1 = convert(nvarchar(4), @year - 1)
  30. set @yyMinus1 = convert(nvarchar(4), substring(@year, 3, 2) - 1)
  31. set @yyMinus2 = convert(nvarchar(4), substring(@year, 3, 2) - 2)
  32. set @yyMinus3 = convert(nvarchar(4), substring(@year, 3, 2) - 3)
  33. set @sql = ' SELECT
  34. T1.AREA
  35. , ISNULL(SUJU_QTY, 0) SUJU_QTY, ISNULL(SUJU_AMT, 0) SUJU_AMT
  36. , ISNULL(CHGO_QTY, 0) CHGO_QTY, ISNULL(CHGO_AMT, 0) CHGO_AMT
  37. , ISNULL(INVT_QTY, 0) INVT_QTY, ISNULL(INVT_AMT, 0) INVT_AMT
  38. , ISNULL(CHGO_QTY, 0) - ISNULL(INVT_QTY, 0) SALE_QTY
  39. , ISNULL(CHGO_AMT, 0) - ISNULL(INVT_AMT, 0) SALE_AMT
  40. FROM (
  41. SELECT * FROM (
  42. SELECT CODE AS AREA, SERIAL FROM MCODE02TT WHERE GRCODE = ''101''
  43. ) T1
  44. ) T1 LEFT OUTER JOIN (
  45. SELECT
  46. AREA, SUM(T1.SUJU_QTY) SUJU_QTY, SUM(T1.SUJU_AMT) SUJU_AMT
  47. FROM (
  48. SELECT 
  49. T1.AREA, T1.ORDERNO, T1.SUJU_QTY
  50. , T1.SUJU_QTY * ISNULL((SELECT CHULGOGA CHULGOGA FROM SCHGO01TT X WHERE X.SEASON=T1.SEASON AND X.PUMBUN = T1.PUMBUN),0) SUJU_AMT
  51. FROM SMAST01TT T1 INNER JOIN SQUTY01TT T2
  52. ON T1.ORDERNO = T2.ORDERNO
  53. WHERE T2.QTY_GUBUN = ''1''
  54. AND SEASON = @p_yySeason '
  55. if @bokjong is not null or @bokjong <> ''
  56. begin
  57. set @sql = @sql + ' AND T1.BOKJONG = @p_bokjong '
  58. end
  59. set @sql = @sql + ') T1
  60. GROUP BY AREA
  61. ) T2 ON T1.AREA = T2.AREA
  62. LEFT OUTER JOIN (
  63. SELECT 
  64. AREA, SUM(CHGO_QTY) AS CHGO_QTY, SUM(CHGO_QTY * CHGO_AMT) CHGO_AMT
  65. FROM (
  66. SELECT AREA, SIZE1+SIZE2+SIZE3+SIZE4+SIZE5+SIZE6+SIZE7+SIZE8+SIZE9+SIZE10+SIZE11+SIZE12+SIZE13+B_QTY1+B_QTY2+B_QTY3 AS CHGO_QTY
  67. , ISNULL((SELECT TOP 1 CHULGOGA FROM SMAST01TT X INNER JOIN SCHGO01TT Y ON X.PUMBUN = Y.PUMBUN AND X.SCHOOL = T1.SCHOOL AND X.BOKJONG = T1.BOKJONG  WHERE X.SEASON = @p_yySeason),0) AS CHGO_AMT 
  68. FROM SINVT01TT T1
  69. WHERE YEAR = @p_yyyyMinus1 AND SEASON = @p_season AND S_YEAR IN (@p_yyMinus1, @p_yyMinus2, @p_yyMinus3) '
  70. /* AND T1.BOKJONG = ''C'' */
  71. if @bokjong is not null or @bokjong <> ''
  72. begin
  73. set @sql = @sql + ' AND T1.BOKJONG = @p_bokjong '
  74. end
  75. set @sql = @sql + ') T1
  76. GROUP BY AREA
  77. ) T3
  78. ON T1.AREA = T3.AREA
  79. LEFT OUTER JOIN (
  80. SELECT 
  81. AREA, SUM(INVT_QTY) AS INVT_QTY, SUM(INVT_QTY * INVT_AMT) INVT_AMT
  82. FROM (
  83. SELECT AREA, SIZE1+SIZE2+SIZE3+SIZE4+SIZE5+SIZE6+SIZE7+SIZE8+SIZE9+SIZE10+SIZE11+SIZE12+SIZE13+B_QTY1+B_QTY2+B_QTY3 AS INVT_QTY
  84. , ISNULL((SELECT TOP 1 CHULGOGA FROM SMAST01TT X INNER JOIN SCHGO01TT Y ON X.PUMBUN = Y.PUMBUN AND X.SCHOOL = T1.SCHOOL AND X.BOKJONG = T1.BOKJONG  WHERE X.SEASON = @p_yySeason),0) AS INVT_AMT 
  85. FROM SINVT01TT T1
  86. WHERE YEAR = @p_year AND SEASON = @p_season AND S_YEAR IN (substring(@p_year, 3, 2), @p_yyMinus1, @p_yyMinus2) '
  87. /* AND T1.BOKJONG = ''C'' */
  88. if @bokjong is not null or @bokjong <> ''
  89. begin
  90. set @sql = @sql + ' AND T1.BOKJONG = @p_bokjong '
  91. end
  92. set @sql = @sql + ') T1
  93. GROUP BY AREA
  94. ) T4
  95. ON T1.AREA = T4.AREA
  96. ORDER BY SERIAL
  97. '
  98. exec SP_EXECUTESQL @sql, @param, @p_year=@year, @p_season=@season, @p_area=@area, @p_agent=@agent, @p_yyyyMinus1=@yyyyMinus1, @p_yyMinus1=@yyMinus1, @p_yyMinus2=@yyMinus2, @p_yyMinus3=@yyMinus3, @p_yySeason=@yySeason, @p_bokjong=@bokjong    
  99. END



테스트

  1. USE [skoolooks_erp]
    GO

    DECLARE@return_value int

    EXEC@return_value = [dbo].[SP_SQUTY12PL_WITH_OLD_000]
    @year = N'2012',
    @season = N'F',
    @area = null,
    @agent = null,
    @bokjong = null

    SELECT'Return Value' = @return_value

    GO

[MSSQL] 오라클의 sequence 같은 기능 구현하기

mssql에서 sequence 구현하기


1. 테이블 생성

CREATE TABLE SEQUENCES (
ID VARCHAR(100) PRIMARY KEY
, SEQ INT
)
GO


2. 프로시져 생성

CREATE PROCEDURE nextval
@id VARCHAR(100)
, @seq INT OUTPUT
as

DECLARE @cnt INT

SELECT @cnt = COUNT(*) FROM SEQUENCES 
WHERE ID = @id

PRINT @cnt

IF @cnt = 0
BEGIN
INSERT INTO SEQUENCES (ID, SEQ) VALUES (@id, 0)
END

UPDATE SEQUENCES SET @seq = seq = seq + 1
WHERE ID = @id

RETURN @seq
GO


3. java

public static int getSequence(Connection connection, String sequenceName) throws Exception {
String procname = null;
procname = "{call nextval(?, ?)}";
CallableStatement cs = null;
int result = 0;
cs = connection.prepareCall(procname);
cs.setString(1, sequenceName);
cs.registerOutParameter(2, java.sql.Types.INTEGER);
cs.execute();
result = Integer.parseInt(cs.getString(2));
return result;
}

[MSSQL] lock 확인 및 강제종료

sp_lock
lock 확인을 위한 프로시저 
mode = x 이면 lock

dbcc inputbuffer(spid)
클라이언트가 MicrosoftSQL Server 인스턴스로 마지막으로 전송한 문을 표시
spid에는 위에서 lock로 표시된 값 입력

kill spid
lock 걸린 프로세스 강제 종료

ms sqlserver management tools 에서 transaction 적용하기

MS-SQL SERVER 2005 부터는
도구>옵션>쿼리 실행>SQL SERVER>ANSI
SET IMPLICIT_TRANSACTIONS를 체크

[MSSQL] merge

sqlserver 도 2008 버전부터 merge가 지원된다



MERGE TMAST03TT AS TARGET
USING (
  SELECT 'A' GUBUN, '2011' YEAR, 'F' SEASON, 'SA001' SCHOOL, 'B' BOKJONG, 'N' PUMOK, 'N' SAYANG, '' P_CODE, '1' P_CODE_VALUE1, '' ISSUE_DATE, '' ISSUE_ID
) AS SOURCE
ON (TARGET.GUBUN = SOURCE.GUBUN AND TARGET.YEAR = SOURCE.YEAR AND TARGET.SEASON = SOURCE.SEASON AND TARGET.SCHOOL = SOURCE.SCHOOL AND TARGET.BOKJONG = SOURCE.BOKJONG)
WHEN MATCHED THEN
  UPDATE SET TARGET.P_CODE_VALUE1 = SOURCE.P_CODE_VALUE1
WHEN NOT MATCHED BY TARGET THEN
  INSERT (GUBUN, YEAR, SEASON, SCHOOL, BOKJONG
    , PUMOK, SAYANG, P_CODE, P_CODE_VALUE1, ISSUE_DATE
    , ISSUE_ID
  )
  VALUES (SOURCE.GUBUN, SOURCE.YEAR, SOURCE.SEASON, SOURCE.SCHOOL, SOURCE.BOKJONG
    , SOURCE.PUMOK, SOURCE.SAYANG, SOURCE.P_CODE, SOURCE.P_CODE_VALUE1, SOURCE.ISSUE_DATE
    , SOURCE.ISSUE_ID)
OUTPUT $action, Inserted.*, Deleted.*
;