根据表名自动生成I/S/U/D的SQL语句,用于MSSQL2000/2005/2008(downmoon)
2009-06-06 15:34
435 查看
网上流传的基本SQL生成语句(Inset/Selec/Update/Delete)方法多了,这里介绍一种,可以用于MSSQL 2000/2005/2008。
第一步:生成测试数据库
SQL
/**/
/*
************自动生成存储过程演示 ****************
*/
/**/
/*
************主要生成以下四个脚本 Delete/Select/Insert/Update ****************
*/
/**/
/*
************说明:仅用于MSSQL 2000/2005/2008 ****************
*/
/**/
/*
************tony 2009.06.06 Update ****************
*/
/**/
/*
************MSN:3w@live.cn ****************
*/
/**/
/*
************自动生成存储过程演示 ****************
*/
/**/
/*
***********************创建测试数据库[TestProcedure]******************************
*/
use
master
go
IF
EXISTS
(
SELECT
name
FROM
master.dbo.sysdatabases
WHERE
name
=
N
'
TestProcedure
'
)
DROP
DATABASE
[
TestProcedure
]
GO
create
database
[
TestProcedure
]
go
use
[
TestProcedure
]
go
第二步:生成主要存储过程
Code
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Delete记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeDeleteRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Delete a single record from
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
DELETE
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Insert记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeInsertRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sAllFields
varchar
(
2000
),
@sAllParams
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@HasIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@HasIdentity
=
0
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sAllFields
=
''
SET
@sWhereClause
=
''
SET
@sAllParams
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Insert a single record into
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@sAllFields
<>
''
)
BEGIN
SET
@sAllParams
=
@sAllParams
+
'
,
'
SET
@sAllFields
=
@sAllFields
+
'
,
'
END
IF
(
@sTypeName
=
'
timestamp
'
)
SET
@sAllParams
=
@sAllParams
+
'
NULL
'
ELSE
IF
(
@sDefaultValue
IS
NOT
NULL
)
SET
@sAllParams
=
@sAllParams
+
'
COALESCE(@
'
+
@sColumnName
+
'
,
'
+
@sDefaultValue
+
'
)
'
ELSE
SET
@sAllParams
=
@sAllParams
+
'
@
'
+
@sColumnName
SET
@sAllFields
=
@sAllFields
+
@sColumnName
END
ELSE
BEGIN
SET
@HasIdentity
=
1
END
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sDefaultValue
IS
NOT
NULL
)
OR
(
@IsNullable
=
1
)
OR
(
@sTypeName
=
'
timestamp
'
)
SET
@sKeyFields
=
@sKeyFields
+
'
= NULL
'
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
INSERT
'
+
@sTableName
+
'
(
'
+
@sAllFields
+
'
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
VALUES (
'
+
@sAllParams
+
'
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
(
@HasIdentity
=
1
)
BEGIN
SET
@sProcText
=
@sProcText
+
'
RETURN SCOPE_IDENTITY()
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
END
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Select记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeSelectRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sSelectClause
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sSelectClause
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Select
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Select
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Select a single record from
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Select
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
IF
(
@sSelectClause
=
''
)
SET
@sSelectClause
=
@sSelectClause
+
'
SELECT
'
ELSE
SET
@sSelectClause
=
@sSelectClause
+
'
,
'
+
@sCRLF
SET
@sSelectClause
=
@sSelectClause
+
@sTAB
+
@sColumnName
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sSelectClause
=
@sSelectClause
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sSelectClause
SET
@sProcText
=
@sProcText
+
'
FROM
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Update记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeUpdateRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sSetClause
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sSetClause
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Update
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Update
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Update a single record in
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Update
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
ELSE
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sSetClause
=
''
)
SET
@sSetClause
=
@sSetClause
+
'
SET
'
ELSE
SET
@sSetClause
=
@sSetClause
+
'
,
'
+
@sCRLF
SET
@sSetClause
=
@sSetClause
+
@sTAB
+
@sColumnName
+
'
=
'
IF
(
@sTypeName
=
'
timestamp
'
)
SET
@sSetClause
=
@sSetClause
+
'
NULL
'
ELSE
IF
(
@sDefaultValue
IS
NOT
NULL
)
SET
@sSetClause
=
@sSetClause
+
'
COALESCE(@
'
+
@sColumnName
+
'
,
'
+
@sDefaultValue
+
'
)
'
ELSE
SET
@sSetClause
=
@sSetClause
+
'
@
'
+
@sColumnName
END
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@IsNullable
=
1
)
OR
(
@sTypeName
=
'
timestamp
'
)
SET
@sKeyFields
=
@sKeyFields
+
'
= NULL
'
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sSetClause
=
@sSetClause
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
UPDATE
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sSetClause
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
PRINT
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
第三步:生成一些必须的Function
Code
/**/
/*
生成一些通用的Function *************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnCleanDefaultValue(
@sDefaultValue
varchar
(
4000
))
RETURNS
varchar
(
4000
)
AS
BEGIN
RETURN
SubString
(
@sDefaultValue
,
2
,
DataLength
(
@sDefaultValue
)
-
2
)
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnColumnDefault(
@sTableName
varchar
(
128
),
@sColumnName
varchar
(
128
))
RETURNS
varchar
(
4000
)
AS
BEGIN
DECLARE
@sDefaultValue
varchar
(
4000
)
SELECT
@sDefaultValue
=
dbo.fnCleanDefaultValue(COLUMN_DEFAULT)
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME
=
@sTableName
AND
COLUMN_NAME
=
@sColumnName
RETURN
@sDefaultValue
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnIsColumnPrimaryKey(
@sTableName
varchar
(
128
),
@nColumnName
varchar
(
128
))
RETURNS
bit
AS
BEGIN
DECLARE
@nTableID
int
,
@nIndexID
int
,
@i
int
SET
@nTableID
=
OBJECT_ID
(
@sTableName
)
SELECT
@nIndexID
=
indid
FROM
sysindexes
WHERE
id
=
@nTableID
AND
indid
BETWEEN
1
And
254
AND
(status
&
2048
)
=
2048
IF
@nIndexID
Is
Null
RETURN
0
IF
@nColumnName
IN
(
SELECT
sc.
[
name
]
FROM
sysindexkeys sik
INNER
JOIN
syscolumns sc
ON
sik.id
=
sc.id
AND
sik.colid
=
sc.colid
WHERE
sik.id
=
@nTableID
AND
sik.indid
=
@nIndexID
)
BEGIN
RETURN
1
END
RETURN
0
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnTableColumnInfo(
@sTableName
varchar
(
128
))
RETURNS
TABLE
AS
RETURN
SELECT
c.name
AS
sColumnName,
c.colid
AS
nColumnID,
dbo.fnIsColumnPrimaryKey(
@sTableName
, c.name)
AS
bPrimaryKeyColumn,
CASE
WHEN
t.name
IN
(
'
char
'
,
'
varchar
'
,
'
binary
'
,
'
varbinary
'
,
'
nchar
'
,
'
nvarchar
'
)
THEN
1
WHEN
t.name
IN
(
'
decimal
'
,
'
numeric
'
)
THEN
2
ELSE
0
END
AS
nAlternateType,
c.length
AS
nColumnLength,
c.prec
AS
nColumnPrecision,
c.scale
AS
nColumnScale,
c.IsNullable,
SIGN
(c.status
&
128
)
AS
IsIdentity,
t.name
as
sTypeName,
dbo.fnColumnDefault(
@sTableName
, c.name)
AS
sDefaultValue
FROM
syscolumns c
INNER
JOIN
systypes t
ON
c.xtype
=
t.xtype
and
c.usertype
=
t.usertype
WHERE
c.id
=
OBJECT_ID
(
@sTableName
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnTableHasPrimaryKey(
@sTableName
varchar
(
128
))
RETURNS
bit
AS
BEGIN
DECLARE
@nTableID
int
,
@nIndexID
int
SET
@nTableID
=
OBJECT_ID
(
@sTableName
)
SELECT
@nIndexID
=
indid
FROM
sysindexes
WHERE
id
=
@nTableID
AND
indid
BETWEEN
1
And
254
AND
(status
&
2048
)
=
2048
IF
@nIndexID
IS
NOT
Null
RETURN
1
RETURN
0
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
第四步:生成测试数据表,并执行
Code
/**/
/*
***********************创建测试数据表 Product ******************************
*/
if
not
exists
(
select
*
from
dbo.sysobjects
where
id
=
object_id
(N
'
[dbo].[Product]
'
)
and
OBJECTPROPERTY
(id, N
'
IsUserTable
'
)
=
1
)
BEGIN
CREATE
TABLE
[
Product
]
(
[
P_ID
]
[
bigint
]
NOT
NULL
,
[
P_Name
]
[
nvarchar
]
(
255
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
CategoryID1
]
[
int
]
NULL
,
[
CategoryID2
]
[
int
]
NULL
,
[
CategoryID3
]
[
int
]
NULL
,
[
P_SingleIntro
]
[
nvarchar
]
(
1000
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_Intro
]
[
ntext
]
COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_Order
]
[
float
]
NULL
,
[
P_TopTime
]
[
smalldatetime
]
NULL
,
[
P_BigImage
]
[
nvarchar
]
(
150
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_SmallImage
]
[
nvarchar
]
(
150
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
CurState
]
[
smallint
]
NOT
NULL
,
[
RecState
]
[
smallint
]
NOT
NULL
,
[
P_CheckInfo
]
[
nvarchar
]
(
80
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_L_ID
]
[
int
]
NOT
NULL
,
[
P_NewKey1
]
[
nvarchar
]
(
300
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
AddTime
]
[
datetime
]
NOT
NULL
,
[
AddUser
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
ModTime
]
[
datetime
]
NOT
NULL
,
[
ModUser
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
F1
]
[
int
]
NOT
NULL
,
[
F3
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
CONSTRAINT
[
PK_Product
]
PRIMARY
KEY
CLUSTERED
(
[
P_ID
]
)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
TEXTIMAGE_ON
[
PRIMARY
]
END
/**/
/*
*******测试生成**********
*/
--
CPP__SYS_MakeDeleteRecordProc 'Product',0
--
go
--
CPP__SYS_MakeInsertRecordProc 'Product',0
--
go
--
CPP__SYS_MakeSelectRecordProc 'Product',0
--
go
--
CPP__SYS_MakeUpdateRecordProc 'Product',0
--
go
/**/
/*
*******测试生成**********
*/
CPP__SYS_MakeDeleteRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeInsertRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeSelectRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeUpdateRecordProc
'
Product
'
,
1
go
效果如图:
附下载SQL
第一步:生成测试数据库
SQL
/**/
/*
************自动生成存储过程演示 ****************
*/
/**/
/*
************主要生成以下四个脚本 Delete/Select/Insert/Update ****************
*/
/**/
/*
************说明:仅用于MSSQL 2000/2005/2008 ****************
*/
/**/
/*
************tony 2009.06.06 Update ****************
*/
/**/
/*
************MSN:3w@live.cn ****************
*/
/**/
/*
************自动生成存储过程演示 ****************
*/
/**/
/*
***********************创建测试数据库[TestProcedure]******************************
*/
use
master
go
IF
EXISTS
(
SELECT
name
FROM
master.dbo.sysdatabases
WHERE
name
=
N
'
TestProcedure
'
)
DROP
DATABASE
[
TestProcedure
]
GO
create
database
[
TestProcedure
]
go
use
[
TestProcedure
]
go
第二步:生成主要存储过程
Code
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Delete记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeDeleteRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Delete a single record from
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Delete
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
DELETE
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Insert记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeInsertRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sAllFields
varchar
(
2000
),
@sAllParams
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@HasIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@HasIdentity
=
0
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sAllFields
=
''
SET
@sWhereClause
=
''
SET
@sAllParams
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Insert a single record into
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Insert
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@sAllFields
<>
''
)
BEGIN
SET
@sAllParams
=
@sAllParams
+
'
,
'
SET
@sAllFields
=
@sAllFields
+
'
,
'
END
IF
(
@sTypeName
=
'
timestamp
'
)
SET
@sAllParams
=
@sAllParams
+
'
NULL
'
ELSE
IF
(
@sDefaultValue
IS
NOT
NULL
)
SET
@sAllParams
=
@sAllParams
+
'
COALESCE(@
'
+
@sColumnName
+
'
,
'
+
@sDefaultValue
+
'
)
'
ELSE
SET
@sAllParams
=
@sAllParams
+
'
@
'
+
@sColumnName
SET
@sAllFields
=
@sAllFields
+
@sColumnName
END
ELSE
BEGIN
SET
@HasIdentity
=
1
END
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sDefaultValue
IS
NOT
NULL
)
OR
(
@IsNullable
=
1
)
OR
(
@sTypeName
=
'
timestamp
'
)
SET
@sKeyFields
=
@sKeyFields
+
'
= NULL
'
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
INSERT
'
+
@sTableName
+
'
(
'
+
@sAllFields
+
'
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
VALUES (
'
+
@sAllParams
+
'
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
(
@HasIdentity
=
1
)
BEGIN
SET
@sProcText
=
@sProcText
+
'
RETURN SCOPE_IDENTITY()
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
END
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Select记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeSelectRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sSelectClause
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sSelectClause
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Select
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Select
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Select a single record from
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Select
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
IF
(
@sSelectClause
=
''
)
SET
@sSelectClause
=
@sSelectClause
+
'
SELECT
'
ELSE
SET
@sSelectClause
=
@sSelectClause
+
'
,
'
+
@sCRLF
SET
@sSelectClause
=
@sSelectClause
+
@sTAB
+
@sColumnName
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sSelectClause
=
@sSelectClause
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sSelectClause
SET
@sProcText
=
@sProcText
+
'
FROM
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
/**/
/*
生成一个Update记录的存储过程*************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
CREATE
PROC
CPP__SYS_MakeUpdateRecordProc
@sTableName
varchar
(
128
),
@bExecute
bit
=
0
AS
IF
dbo.fnTableHasPrimaryKey(
@sTableName
)
=
0
BEGIN
RAISERROR
(
'
Procedure cannot be created on a table with no primary key.
'
,
10
,
1
)
RETURN
END
DECLARE
@sProcText
varchar
(
8000
),
@sKeyFields
varchar
(
2000
),
@sSetClause
varchar
(
2000
),
@sWhereClause
varchar
(
2000
),
@sColumnName
varchar
(
128
),
@nColumnID
smallint
,
@bPrimaryKeyColumn
bit
,
@nAlternateType
int
,
@nColumnLength
int
,
@nColumnPrecision
int
,
@nColumnScale
int
,
@IsNullable
bit
,
@IsIdentity
int
,
@sTypeName
varchar
(
128
),
@sDefaultValue
varchar
(
4000
),
@sCRLF
char
(
2
),
@sTAB
char
(
1
)
SET
@sTAB
=
char
(
9
)
SET
@sCRLF
=
char
(
13
)
+
char
(
10
)
SET
@sProcText
=
''
SET
@sKeyFields
=
''
SET
@sSetClause
=
''
SET
@sWhereClause
=
''
SET
@sProcText
=
@sProcText
+
'
IF EXISTS(SELECT * FROM sysobjects WHERE name =
''
AutoGenerateSys__
'
+
@sTableName
+
'
_Update
''
)
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sTAB
+
'
DROP PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Update
'
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
SET
@sProcText
=
''
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
-- Update a single record in
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
----------------------------------------------------------------------------
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
CREATE PROC AutoGenerateSys__
'
+
@sTableName
+
'
_Update
'
+
@sCRLF
DECLARE
crKeyFields
cursor
for
SELECT
*
FROM
dbo.fnTableColumnInfo(
@sTableName
)
ORDER
BY
2
OPEN
crKeyFields
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
IF
(
@sKeyFields
<>
''
)
SET
@sKeyFields
=
@sKeyFields
+
'
,
'
+
@sCRLF
SET
@sKeyFields
=
@sKeyFields
+
@sTAB
+
'
@
'
+
@sColumnName
+
'
'
+
@sTypeName
IF
(
@nAlternateType
=
2
)
--
decimal, numeric
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnPrecision
AS
varchar
(
3
))
+
'
,
'
+
CAST
(
@nColumnScale
AS
varchar
(
3
))
+
'
)
'
ELSE
IF
(
@nAlternateType
=
1
)
--
character and binary
SET
@sKeyFields
=
@sKeyFields
+
'
(
'
+
CAST
(
@nColumnLength
AS
varchar
(
4
))
+
'
)
'
IF
(
@bPrimaryKeyColumn
=
1
)
BEGIN
IF
(
@sWhereClause
=
''
)
SET
@sWhereClause
=
@sWhereClause
+
'
WHERE
'
ELSE
SET
@sWhereClause
=
@sWhereClause
+
'
AND
'
SET
@sWhereClause
=
@sWhereClause
+
@sTAB
+
@sColumnName
+
'
= @
'
+
@sColumnName
+
@sCRLF
END
ELSE
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@sSetClause
=
''
)
SET
@sSetClause
=
@sSetClause
+
'
SET
'
ELSE
SET
@sSetClause
=
@sSetClause
+
'
,
'
+
@sCRLF
SET
@sSetClause
=
@sSetClause
+
@sTAB
+
@sColumnName
+
'
=
'
IF
(
@sTypeName
=
'
timestamp
'
)
SET
@sSetClause
=
@sSetClause
+
'
NULL
'
ELSE
IF
(
@sDefaultValue
IS
NOT
NULL
)
SET
@sSetClause
=
@sSetClause
+
'
COALESCE(@
'
+
@sColumnName
+
'
,
'
+
@sDefaultValue
+
'
)
'
ELSE
SET
@sSetClause
=
@sSetClause
+
'
@
'
+
@sColumnName
END
IF
(
@IsIdentity
=
0
)
BEGIN
IF
(
@IsNullable
=
1
)
OR
(
@sTypeName
=
'
timestamp
'
)
SET
@sKeyFields
=
@sKeyFields
+
'
= NULL
'
END
FETCH
NEXT
FROM
crKeyFields
INTO
@sColumnName
,
@nColumnID
,
@bPrimaryKeyColumn
,
@nAlternateType
,
@nColumnLength
,
@nColumnPrecision
,
@nColumnScale
,
@IsNullable
,
@IsIdentity
,
@sTypeName
,
@sDefaultValue
END
CLOSE
crKeyFields
DEALLOCATE
crKeyFields
SET
@sSetClause
=
@sSetClause
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sKeyFields
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
AS
'
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sCRLF
SET
@sProcText
=
@sProcText
+
'
UPDATE
'
+
@sTableName
+
@sCRLF
SET
@sProcText
=
@sProcText
+
@sSetClause
SET
@sProcText
=
@sProcText
+
@sWhereClause
SET
@sProcText
=
@sProcText
+
@sCRLF
IF
@bExecute
=
0
SET
@sProcText
=
@sProcText
+
'
GO
'
+
@sCRLF
@sProcText
IF
@bExecute
=
1
EXEC
(
@sProcText
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
第三步:生成一些必须的Function
Code
/**/
/*
生成一些通用的Function *************************
tony 2009.06.06 Update
MSN:3w@live.cn
@sTableName 表名
@bExecute 是否执行 默认0不执行
*/
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnCleanDefaultValue(
@sDefaultValue
varchar
(
4000
))
RETURNS
varchar
(
4000
)
AS
BEGIN
RETURN
SubString
(
@sDefaultValue
,
2
,
DataLength
(
@sDefaultValue
)
-
2
)
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnColumnDefault(
@sTableName
varchar
(
128
),
@sColumnName
varchar
(
128
))
RETURNS
varchar
(
4000
)
AS
BEGIN
DECLARE
@sDefaultValue
varchar
(
4000
)
SELECT
@sDefaultValue
=
dbo.fnCleanDefaultValue(COLUMN_DEFAULT)
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME
=
@sTableName
AND
COLUMN_NAME
=
@sColumnName
RETURN
@sDefaultValue
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnIsColumnPrimaryKey(
@sTableName
varchar
(
128
),
@nColumnName
varchar
(
128
))
RETURNS
bit
AS
BEGIN
DECLARE
@nTableID
int
,
@nIndexID
int
,
@i
int
SET
@nTableID
=
OBJECT_ID
(
@sTableName
)
SELECT
@nIndexID
=
indid
FROM
sysindexes
WHERE
id
=
@nTableID
AND
indid
BETWEEN
1
And
254
AND
(status
&
2048
)
=
2048
IF
@nIndexID
Is
Null
RETURN
0
IF
@nColumnName
IN
(
SELECT
sc.
[
name
]
FROM
sysindexkeys sik
INNER
JOIN
syscolumns sc
ON
sik.id
=
sc.id
AND
sik.colid
=
sc.colid
WHERE
sik.id
=
@nTableID
AND
sik.indid
=
@nIndexID
)
BEGIN
RETURN
1
END
RETURN
0
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnTableColumnInfo(
@sTableName
varchar
(
128
))
RETURNS
TABLE
AS
RETURN
SELECT
c.name
AS
sColumnName,
c.colid
AS
nColumnID,
dbo.fnIsColumnPrimaryKey(
@sTableName
, c.name)
AS
bPrimaryKeyColumn,
CASE
WHEN
t.name
IN
(
'
char
'
,
'
varchar
'
,
'
binary
'
,
'
varbinary
'
,
'
nchar
'
,
'
nvarchar
'
)
THEN
1
WHEN
t.name
IN
(
'
decimal
'
,
'
numeric
'
)
THEN
2
ELSE
0
END
AS
nAlternateType,
c.length
AS
nColumnLength,
c.prec
AS
nColumnPrecision,
c.scale
AS
nColumnScale,
c.IsNullable,
SIGN
(c.status
&
128
)
AS
IsIdentity,
t.name
as
sTypeName,
dbo.fnColumnDefault(
@sTableName
, c.name)
AS
sDefaultValue
FROM
syscolumns c
INNER
JOIN
systypes t
ON
c.xtype
=
t.xtype
and
c.usertype
=
t.usertype
WHERE
c.id
=
OBJECT_ID
(
@sTableName
)
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
SET
ANSI_NULLS
ON
GO
CREATE
FUNCTION
dbo.fnTableHasPrimaryKey(
@sTableName
varchar
(
128
))
RETURNS
bit
AS
BEGIN
DECLARE
@nTableID
int
,
@nIndexID
int
SET
@nTableID
=
OBJECT_ID
(
@sTableName
)
SELECT
@nIndexID
=
indid
FROM
sysindexes
WHERE
id
=
@nTableID
AND
indid
BETWEEN
1
And
254
AND
(status
&
2048
)
=
2048
IF
@nIndexID
IS
NOT
Null
RETURN
1
RETURN
0
END
GO
SET
QUOTED_IDENTIFIER
OFF
GO
SET
ANSI_NULLS
ON
GO
第四步:生成测试数据表,并执行
Code
/**/
/*
***********************创建测试数据表 Product ******************************
*/
if
not
exists
(
select
*
from
dbo.sysobjects
where
id
=
object_id
(N
'
[dbo].[Product]
'
)
and
OBJECTPROPERTY
(id, N
'
IsUserTable
'
)
=
1
)
BEGIN
CREATE
TABLE
[
Product
]
(
[
P_ID
]
[
bigint
]
NOT
NULL
,
[
P_Name
]
[
nvarchar
]
(
255
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
CategoryID1
]
[
int
]
NULL
,
[
CategoryID2
]
[
int
]
NULL
,
[
CategoryID3
]
[
int
]
NULL
,
[
P_SingleIntro
]
[
nvarchar
]
(
1000
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_Intro
]
[
ntext
]
COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_Order
]
[
float
]
NULL
,
[
P_TopTime
]
[
smalldatetime
]
NULL
,
[
P_BigImage
]
[
nvarchar
]
(
150
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_SmallImage
]
[
nvarchar
]
(
150
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
CurState
]
[
smallint
]
NOT
NULL
,
[
RecState
]
[
smallint
]
NOT
NULL
,
[
P_CheckInfo
]
[
nvarchar
]
(
80
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
P_L_ID
]
[
int
]
NOT
NULL
,
[
P_NewKey1
]
[
nvarchar
]
(
300
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
AddTime
]
[
datetime
]
NOT
NULL
,
[
AddUser
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
ModTime
]
[
datetime
]
NOT
NULL
,
[
ModUser
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
[
F1
]
[
int
]
NOT
NULL
,
[
F3
]
[
nvarchar
]
(
50
) COLLATE Chinese_PRC_CI_AS
NULL
,
CONSTRAINT
[
PK_Product
]
PRIMARY
KEY
CLUSTERED
(
[
P_ID
]
)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
TEXTIMAGE_ON
[
PRIMARY
]
END
/**/
/*
*******测试生成**********
*/
--
CPP__SYS_MakeDeleteRecordProc 'Product',0
--
go
--
CPP__SYS_MakeInsertRecordProc 'Product',0
--
go
--
CPP__SYS_MakeSelectRecordProc 'Product',0
--
go
--
CPP__SYS_MakeUpdateRecordProc 'Product',0
--
go
/**/
/*
*******测试生成**********
*/
CPP__SYS_MakeDeleteRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeInsertRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeSelectRecordProc
'
Product
'
,
1
go
CPP__SYS_MakeUpdateRecordProc
'
Product
'
,
1
go
效果如图:
附下载SQL
相关文章推荐
- 根据表名自动生成I/S/U/D的SQL语句,用于MSSQL2000/2005/2008
- 根据表名自动生成I/S/U/D的SQL语句,用于MSSQL2000/2005/2008
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- 根据Model有值的自动生成添加的Sql语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- 根据DELTA自动生成SQL语句
- 根据DELTA自动生成SQL语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- asp根据表单自动生成sql语句的函数
- asp根据表单自动生成sql语句的函数
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- asp根据表单自动生成sql语句的函数
- 根据实体自动生成sql语句并且执行
- 根据实体自动生成sql语句并且执行
- sql语句优化与时间成本(downmoon)
- 自动生成清空数据库的SQL语句 ----C#.NET 通用权限管理系统,.NET 开发者的福音
- MyBatis自动生成代码】根据数据库生成对应实体类,SQL方法等
- 反射+注释,根据实体类对象生成SQL语句工具类
- 反射+注释,根据实体类对象生成SQL语句工具类
- 根据SQL语句生成同一类型的XML文件