如何用一个Java工具类构建sql语句
2017-08-25 13:20
330 查看
首先写一个名字转换器,需要讲实体类名字转换为对应的表名,代码如下:
public class DefaultNameHandler implements NameHandler {
/** 字段前缀 */
private static final String PREFIX = "_";
/** 主键后缀 */
private static final String PRI_SUFFIX = "_id";
/**
* 根据实体名获取表名
*
* @param entityName
* @return
*/
@Override
public String getTableName(String entityName) {
return getUnderlineName(entityName);
}
/**
* 根据实体名获取表名
*
* @param entityName
* @return
*/
public String getTableName(Object obj) {
String clazzName = obj.getClass().getSimpleName();
return getTableName(clazzName);
}
/**
* 根据对象字段属性获取数据库字段名
*
* Java属性的骆驼命名法转换回数据库下划线“_”分隔的格式
*
* @param str
* @return
*/
public String getUnderlineName(String str) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isLowerCase(c)) {
if (i == 0) {
sb.append(Character.toLowerCase(c));
} else {
sb.append("_").append(Character.toLowerCase(c));
}
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
* 根据表名获取主键名 本地使用"did"
*
* @param entityName
* @return
*/
@Override
public String getPrimaryName(String entityName) {
return "did";
}
/**
* 根据属性名获取列名
*
* @param fieldName
* @return
*/
@Override
public String getColumnName(String fieldName) {
return getUnderlineName(fieldName);
}
其次写一个工具类:
public class SqlUtils {
private static final Log logger = LogFactory.getLog(SqlUtils.class);
/**
* 构建删除
*
* @param entity
* @param nameHandler
* @
4000
return
* @throws Exception
*/
public static SqlContext buildDeleteSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("delete from ");
sql.append(tableName);
sql.append(" where ");
SqlContext condition = buildQueryCondition(entity, nameHandler);
sql.append(condition.getSql());
return new SqlContext(sql, primaryName, condition.getParams());
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
args.append("?");
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
return new SqlContext(sql, primaryName, params);
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
args.append("'").append(value).append("'");
}
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParamList(List list,
NameHandler nameHandler) throws Exception {
Object entity = list.get(0);
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
sql.append(" values ");
StringBuilder args = new StringBuilder();
for (Object obj : list) {
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), obj);
if (value == null) {
continue;
}
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(
DateUtils.formatDateTimeToString(val)).append("'");
} else {
args.append("'").append(value).append("'");
}
args.append(",");
}
args.deleteCharAt(args.length() - 1);
args.append("),");
}
args.deleteCharAt(args.length() - 1);
sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建更新sql
*
* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
sql.append("?");
params.add(value);
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = ?");
params.add(primaryValue);
return new SqlContext(sql, primaryName, params);
}
private static Boolean isNumber(Object obj) {
if (obj instanceof Integer || obj instanceof Double
|| obj instanceof Float || obj instanceof Short) {
return true;
}
return false;
}
private static Boolean isDate(Object obj) {
if (obj instanceof Date) {
return true;
}
return false;
}
/**
* 构建更新sql
*
* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
if (isNumber(value)) {
sql.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
sql.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
sql.append("'").append(value).append("'");
}
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = '");
sql.append(primaryValue).append("'");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建查询条件
*
* @param entity
* @param nameHandler
* @throws Exception
*/
public static SqlContext buildQueryCondition(Object entity,
NameHandler nameHandler) throws Exception {
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(entity.getClass());
// PropertyDescriptor[] pds =s
// BeanUtils.getPropertyDescriptors(entityClass);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
StringBuilder condition = new StringBuilder();
List<Object> params = new ArrayList<Object>();
int count = 0;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
if (count > 0) {
condition.append(" and ");
}
condition.append(nameHandler.getColumnName(pd.getName()));
condition.append(" = ?");
params.add(value);
count++;
}
return new SqlContext(condition, null, params);
}
/**
* 获取属性值
*
* @param readMethod
* @param entity
* @return
* @throws Exception
*/
private static Object getReadMethodValue(Method readMethod, Object entity)
throws Exception {
if (readMethod == null) {
return null;
}
try {
if (!Modifier.isPublic(readMethod.getDeclaringClass()
.getModifiers())) {
readMethod.setAccessible(true);
}
return readMethod.invoke(entity);
} catch (Exception e) {
e.printStackTrace(LogUtil.getErrorStream(logger));
throw e;
}
}
public class DefaultNameHandler implements NameHandler {
/** 字段前缀 */
private static final String PREFIX = "_";
/** 主键后缀 */
private static final String PRI_SUFFIX = "_id";
/**
* 根据实体名获取表名
*
* @param entityName
* @return
*/
@Override
public String getTableName(String entityName) {
return getUnderlineName(entityName);
}
/**
* 根据实体名获取表名
*
* @param entityName
* @return
*/
public String getTableName(Object obj) {
String clazzName = obj.getClass().getSimpleName();
return getTableName(clazzName);
}
/**
* 根据对象字段属性获取数据库字段名
*
* Java属性的骆驼命名法转换回数据库下划线“_”分隔的格式
*
* @param str
* @return
*/
public String getUnderlineName(String str) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isLowerCase(c)) {
if (i == 0) {
sb.append(Character.toLowerCase(c));
} else {
sb.append("_").append(Character.toLowerCase(c));
}
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
* 根据表名获取主键名 本地使用"did"
*
* @param entityName
* @return
*/
@Override
public String getPrimaryName(String entityName) {
return "did";
}
/**
* 根据属性名获取列名
*
* @param fieldName
* @return
*/
@Override
public String getColumnName(String fieldName) {
return getUnderlineName(fieldName);
}
其次写一个工具类:
public class SqlUtils {
private static final Log logger = LogFactory.getLog(SqlUtils.class);
/**
* 构建删除
*
* @param entity
* @param nameHandler
* @
4000
return
* @throws Exception
*/
public static SqlContext buildDeleteSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("delete from ");
sql.append(tableName);
sql.append(" where ");
SqlContext condition = buildQueryCondition(entity, nameHandler);
sql.append(condition.getSql());
return new SqlContext(sql, primaryName, condition.getParams());
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
args.append("?");
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
return new SqlContext(sql, primaryName, params);
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
args.append("'").append(value).append("'");
}
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建insert语句
*
* @param entity
* 实体映射对象
* @param nameHandler
* 名称转换处理器
* @return
* @throws Exception
*/
public static SqlContext buildInsertSqlNoParamList(List list,
NameHandler nameHandler) throws Exception {
Object entity = list.get(0);
Class<?> clazz = entity.getClass();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
StringBuilder sql = new StringBuilder("insert into ");
List<Object> params = new ArrayList<Object>();
sql.append(tableName);
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(nameHandler.getColumnName(pd.getName()));
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
sql.append(" values ");
StringBuilder args = new StringBuilder();
for (Object obj : list) {
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), obj);
if (value == null) {
continue;
}
if (isNumber(value)) {
args.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
args.append("'").append(
DateUtils.formatDateTimeToString(val)).append("'");
} else {
args.append("'").append(value).append("'");
}
args.append(",");
}
args.deleteCharAt(args.length() - 1);
args.append("),");
}
args.deleteCharAt(args.length() - 1);
sql.append(args);
sql.append(";");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建更新sql
*
* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSql(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
sql.append("?");
params.add(value);
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = ?");
params.add(primaryValue);
return new SqlContext(sql, primaryName, params);
}
private static Boolean isNumber(Object obj) {
if (obj instanceof Integer || obj instanceof Double
|| obj instanceof Float || obj instanceof Short) {
return true;
}
return false;
}
private static Boolean isDate(Object obj) {
if (obj instanceof Date) {
return true;
}
return false;
}
/**
* 构建更新sql
*
* @param entity
* @param nameHandler
* @return
* @throws Exception
*/
public static SqlContext buildUpdateSqlNoParam(Object entity,
NameHandler nameHandler) throws Exception {
Class<?> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<Object>();
String tableName = nameHandler.getTableName(clazz.getSimpleName());
String primaryName = nameHandler.getPrimaryName(clazz.getSimpleName());
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = nameHandler.getColumnName(pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
if (isNumber(value)) {
sql.append(value);
} else if (isDate(value)) {
Date val = (Date) value;
sql.append("'").append(DateUtils.formatDateTimeToString(val))
.append("'");
} else {
sql.append("'").append(value).append("'");
}
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = '");
sql.append(primaryValue).append("'");
return new SqlContext(sql, primaryName, params);
}
/**
* 构建查询条件
*
* @param entity
* @param nameHandler
* @throws Exception
*/
public static SqlContext buildQueryCondition(Object entity,
NameHandler nameHandler) throws Exception {
// 获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(entity.getClass());
// PropertyDescriptor[] pds =s
// BeanUtils.getPropertyDescriptors(entityClass);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
StringBuilder condition = new StringBuilder();
List<Object> params = new ArrayList<Object>();
int count = 0;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
if (count > 0) {
condition.append(" and ");
}
condition.append(nameHandler.getColumnName(pd.getName()));
condition.append(" = ?");
params.add(value);
count++;
}
return new SqlContext(condition, null, params);
}
/**
* 获取属性值
*
* @param readMethod
* @param entity
* @return
* @throws Exception
*/
private static Object getReadMethodValue(Method readMethod, Object entity)
throws Exception {
if (readMethod == null) {
return null;
}
try {
if (!Modifier.isPublic(readMethod.getDeclaringClass()
.getModifiers())) {
readMethod.setAccessible(true);
}
return readMethod.invoke(entity);
} catch (Exception e) {
e.printStackTrace(LogUtil.getErrorStream(logger));
throw e;
}
}
相关文章推荐
- 如何用JAVA语句创建一个表
- 在同一个sql语句中如何写不同条件的count数量
- 如何查看,当运行一个hibernate 方法后到底执行了哪些SQL语句
- java 为一个实体类中已赋值的属性生成sql语句
- 一个ASP(JScript)简单SQL语句构建“类”,同时支持客户端和服务器端执行的
- 如何判断数据库中1个表已经存在,这样不会重复创建一个新表(用sql语句)
- MyBatis之SQL语句映射文件增删改查和Java参数如何对应
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
- ACCESS中如何用sql语句创建一个查询
- 如何判断一个表是否建立索引约束等信息的SQL语句
- 如何用一段SQL语句递归找到一个目录下的所有子目录...
- 一个ASP(JScript)简单SQL语句构建“类”,同时支持客户端和服务器端执行的
- 如何利用SQL语句查看某一个表全部列或单个列的属性?
- 如何用一个SQL语句查询多个表的记录数
- spool一个sql文件,如何去掉文件开头的sql语句
- 如何用一个SQL语句产生一系列流水编号
- 求助:关于一个查询的SQL语句,请高人指点如何实现,谢谢!
- 如何用一条SQL语句,将多条记录(一个字段)合并为一个?
- 如何查看一个SCCM报表的SQL语句
- SQL2005 中 pivot() 的使用 如何通过一个SQL语句变成竖表