[翻译]在论坛上怎么贴数据和脚本才能得到最好(最快)的帮助
首先感谢pureaqua同学帮我校稿和润色, 才使我能较早的把此文贴出来.
不知道发在这儿行不行. 主要是讲我们SQL的, 所以就先发这儿吧. 其实此文对别的提问题贴都合适的. 版主看在哪儿合适, 可以转过去. 谢谢.
在这个论坛不长的时间里看到好多象这样的贴子: "我连不上SQL SERVER了. 急!! 请高手/专家帮忙!!!"
每次看到这样的贴子, 就觉得不知说什么好了. 我肯定回贴的有N种说法. 这样很浪费大家的时间, 主要是耽误了发贴者自己的时间.
而发贴者本来是想尽快解决的 (除非是故意消遣大家). 如果你能把错误信息和你的环境说清楚, 那么回贴的就可以更有针对性了.
(例如你说: 我的SQL Server 2005 EE + SP2 + Windows 2003 SP2 + 域. 现在出现了 -- 连接失败, 请查SQL Server注册信息 ---的错误.)
这样一说是不是清楚很多呀?
前两天在一国外论坛上发现一篇讲怎么问问题的文章, 感觉不错, 给大家翻译看看,献丑了。
**************************************************************************************
论坛的礼仪: 在论坛上怎么贴数据和脚本才能得到最好(最快)的帮助
前言
当你碰到T-SQL的问题时, 你很想有人能帮你一把. 于是就进了一个著名的网站, 如, bbs.csdn.net, 你知道在那儿有很多高手/专家会很快对你的问题感兴趣并会帮你解决. 你马上把你的表结构和数据贴了上去, 并且自以为已经很好的描述了你的问题和你想得到的结果.....
但是, 过了几小时, 甚至几天, 你的贴子都没人回. 在你老板的压力和很绝望的情况下, 你可能会使用两种在各种论坛中最不齿的行为: 重复发贴和自己"顶"贴.........
然而,当终于有人回答你绝望的求助时却发现别人给你的代码是错的, 甚至更糟的是只给个很闹心的建议而不是经过测试并能解决你的问题的代码.
那么问题在哪儿呢?
大多数情况是你贴数据或代码的方法错了
贴数据的错误方法
一般情况下, 当某人贴上一个诸如"我有个含如下的数据的表"的贴子时, 他(她)就会贴出下面数据:(这只是600多实际数据中的前8个)
ID DateValue Value YearValue Monthvalue
4 2007-10-17 00:00:00.000 5.1709 8 1
37 2007-10-17 00:00:00.000 5.5319 17 8
44 2007-10-17 00:00:00.000 5.5793 21 11
54 2007-10-17 00:00:00.000 5.2471 9 2
55 2007-10-17 00:00:00.000 5.1177 7 0
81 2007-10-17 00:00:00.000 5.5510 18 9
86 2007-10-17 00:00:00.000 5.5128 16 7
96 2007-10-17 00:00:00.000 5.5758 20 10
恩, 这个看起来还不错吧, 其实根本是没用的实际测试数据. 没人会把这些数据手工输入测试表中, 原因很简单:首先必须做一些格式化的工作. 如果需要做很多前期工作去把数据输入进测试表的话, 那么很多高手是不会花时间去回答这样的问题的. 即使把数据存文件上并用程序输入, 对一个想帮忙解决问题的人来说也是很烦的, 更别说在一个字段的DATETIME的数据类型的数据中还有个空格, 那更是让人退避三舍了.
即便是真有人回了贴并贴了代码, 除非是用了你的数据做了测试, 否则很可能那代码是错的或给的结果根本不是你想要的.
贴数据的正确方法应该是这样的:
首先要问:你用什么方式贴数据才能建实际的表呢? 对!当然你应该做所有的前期工作....虽然这也会费你一些时间. 但是谁叫我们有求于人呢
这里有个方法建表和输入数据对大家(包括你自己)都容易:
写出建表代码
对, 这第一部分都是手工的....但却是值得的,不会花很多时间, 而且还会起如下的作用:
1. 很好地表示了字段的数据类型. 光这点就能回答很多不必要的提问.
2. 很好地描述了表的约束, 条件, 和主键, 也避免了你被N多回贴地"逼问", 因为你的表在实际中就是那么建的.
3. 能吸引那些能帮助你的人真正地花些时间帮你解决问题.(这点最重要)
因此, 对上面一开始给的数据, 你应该写些下面的代码:
--===== 如果该测试表已经存在, drop it
IF OBJECT_ID('TempDB..#mytable','U') IS NOT NULL
DROP TABLE #mytable
--===== 建个测试表
CREATE TABLE #mytable
(
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
DateValue DATETIME,
Value DECIMAL(9,4),
YearValue INT,
MonthValue INT
)
--===== 建立其他特殊要求的条件, 尤其是需要考虑时间类型时
SET DATEFORMAT DMY
注意到那个SET语句输入的原始数据是DMY(日月年)格式的. 为了避免更多的解释, SET语句被归类为"特殊条件". 这样, 那些潜水的牛人就可以在输入你的数据时根本不用考虑转换时间类型而是专心于你的问题了.
创建一些数据
当然啦, 最好的方式是用SELECT语句从实际的表中选出一些数据贴出来. 大多数人是这么做的. 不过呢, 很多人贴出了象本文一开始贴出的那种没格式化好的, 很难输入的数据. 就这一点就没人理你的贴子了, 要么人家就写些"没测试过的"代码, 要知道把你的没格式化好的数据输入到测试表中去实在太痛苦了.
其实, 你只要举手之劳就能让数据"自己输入"了.......这里有个怎样使用QUOTENAME的例子(假设表名是yourtable):
SELECT 'SELECT '
+ QUOTENAME(ID,'''')+','
+ QUOTENAME(DateValue,'''')+','
+ QUOTENAME(Value,'''')+','
+ QUOTENAME(YearValue,'''')+','
+ QUOTENAME(MonthValue,'''')
+ ' UNION ALL'
FROM yourtable
(注: 如果在生成代码时把UNION ALL去掉, 并把QUOTENAME里的单引号换成双引号, 你就能得到一个不错的CSV数据生成代码了!)
如果你在Query Analyzer(SQL2000)或Management Studio(SQL2005)的Text Mode中运行上面的代码, 就会得到个很不错的数据自动生成的输出:
SELECT '4','Oct 17 2007 12:00AM','5.1709','8','1' UNION ALL
SELECT '37','Oct 17 2007 12:00AM','5.5319','17','8' UNION ALL
SELECT '44','Oct 17 2007 12:00AM','5.5793','21','11' UNION ALL
SELECT '54','Oct 17 2007 12:00AM','5.2471','9','2' UNION ALL
SELECT '55','Oct 17 2007 12:00AM','5.1177','7','0' UNION ALL
SELECT '81','Oct 17 2007 12:00AM','5.5510','18','9' UNION ALL
SELECT '86','Oct 17 2007 12:00AM','5.5128','16','7' UNION ALL
SELECT '96','Oct 17 2007 12:00AM','5.5758','20','10' UNION ALL
删掉最后那个"UNION ALL", 加入为插入IDENTITY字段所必需的SET语句, 然后加入实际的INSERT语句. 下面就是你的代码了:
--===== All Inserts into the IDENTITY column
SET IDENTITY_INSERT #mytable ON
--===== Insert the test data into the test table
INSERT INTO #mytable
(ID, DateValue, Value, YearValue, Monthvalue)
SELECT '4','Oct 17 2007 12:00AM','5.1709','8','1' UNION ALL
SELECT '37','Oct 17 2007 12:00AM','5.5319','17','8' UNION ALL
SELECT '44','Oct 17 2007 12:00AM','5.5793','21','11' UNION ALL
SELECT '54','Oct 17 2007 12:00AM','5.2471','9','2' UNION ALL
SELECT '55','Oct 17 2007 12:00AM','5.1177','7','0' UNION ALL
SELECT '81','Oct 17 2007 12:00AM','5.5510','18','9' UNION ALL
SELECT '86','Oct 17 2007 12:00AM','5.5128','16','7' UNION ALL
SELECT '96','Oct 17 2007 12:00AM','5.5758','20','10'
--===== Set the identity insert back to normal
SET IDENTITY_INSERT #mytable OFF
一些数据类型的问题
Money和一些其他数据类型是不允许从CHAR或VARCHAR进行implicit转换的. 那么, 怎么办呢? 答案是简单的, 就是不要在数据上加引号.
在本文的例子中, 如果表的结构是象这样的话:
--===== 如果测试表已经存在, drop it
IF OBJECT_ID('TempDB..#mytable','U') IS NOT NULL
DROP TABLE #mytable
--===== 建个测试表
CREATE TABLE #mytable
(
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, --在实际的表中是IDENTITY字段
DateValue DATETIME,
Value MONEY,
YearValue INT,
MonthValue INT
)
--===== 建立其他特殊要求的条件, 特别是需要考虑时间类型时
SET DATEFORMAT DMY
跟着,那个"数据生成"代码应该象如下的样子 (去掉VALUE数据的引号):
SELECT 'SELECT '
+ QUOTENAME(ID,'''')+','
+ QUOTENAME(DateValue,'''')+','
+ CAST(Value AS VARCHAR)+','
+ QUOTENAME(YearValue,'''')+','
+ QUOTENAME(MonthValue,'''')
+ ' UNION ALL'
FROM yourtable
这样的话就生成能插入character-resistant的MONEY数据类型了:
SELECT '4','Oct 17 2007 12:00AM',5.1709,'8','1' UNION ALL
SELECT '37','Oct 17 2007 12:00AM',5.5319,'17','8' UNION ALL
SELECT '44','Oct 17 2007 12:00AM',5.5793,'21','11' UNION ALL
SELECT '54','Oct 17 2007 12:00AM',5.2471,'9','2' UNION ALL
SELECT '55','Oct 17 2007 12:00AM',5.1177,'7','0' UNION ALL
SELECT '81','Oct 17 2007 12:00AM',5.5510,'18','9' UNION ALL
SELECT '86','Oct 17 2007 12:00AM',5.5128,'16','7' UNION ALL
SELECT '96','Oct 17 2007 12:00AM',5.5758,'20','10'
最后....
如果你做了上述的工作, 那么你很重要的求助贴中的数据和代码应该象:
--===== 如果测试表已经存在, drop it
IF OBJECT_ID('TempDB..#mytable','U') IS NOT NULL
DROP TABLE #mytable
--===== 建个测试表
CREATE TABLE #mytable
(
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, --在实际的表中是IDENTITY字段
DateValue DATETIME,
Value MONEY,
YearValue INT,
MonthValue INT
)
--===== 建立其他特殊要求的条件, 特别是需要考虑时间类型时
SET DATEFORMAT DMY
--===== All Inserts into the IDENTITY column
SET IDENTITY_INSERT #mytable ON
--===== Insert the test data into the test table
INSERT INTO #mytable
(ID, DateValue, Value, YearValue, Monthvalue)
SELECT '4','Oct 17 2007 12:00AM',5.1709,'8','1' UNION ALL
SELECT '37','Oct 17 2007 12:00AM',5.5319,'17','8' UNION ALL
SELECT '44','Oct 17 2007 12:00AM',5.5793,'21','11' UNION ALL
SELECT '54','Oct 17 2007 12:00AM',5.2471,'9','2' UNION ALL
SELECT '55','Oct 17 2007 12:00AM',5.1177,'7','0' UNION ALL
SELECT '81','Oct 17 2007 12:00AM',5.5510,'18','9' UNION ALL
SELECT '86','Oct 17 2007 12:00AM',5.5128,'16','7' UNION ALL
SELECT '96','Oct 17 2007 12:00AM',5.5758,'20','10'
--===== Set the identity insert back to normal
SET IDENTITY_INSERT #mytable OFF
相关推荐
基于springboot+vue的摄影作品社区(项目源码)
基于springboot+vue的摄影作品社区(项目源码) 系统采用前后端分离的 B/S 架构。后端基于 Spring Boot 2.7.2 与 Java 1.8 构建,以 MyBatis-Plus 完成数据访问、PageHelper 实现分页,用 MySQL 8 存储业务数据;身份认证采用 Sa-Token 轻量级框架并整合 JWT 令牌,配合 Redis 实现图形验证码缓存与会话存储;前端使用 Vue 3 与 Naive UI 构建界面,由 Vite 完成构建,看板统计图表基于 ECharts 渲染。系统面向普通用户与管理员两类角色:用户端提供注册登录、作品上传与归档、多条件检索浏览、作品集管理、分类与标签管理、摄影圈专题、回收站、个人设置与公告查看等功能;管理端提供数据看板、用户管理与公告管理等功能。
Vue基于springboot的乡村生态旅游平台_k2864o48毕业设计源码数据库.zip
Vue基于springboot的乡村生态旅游平台_k2864o48毕业设计源码数据库
Python3 datetime时区避坑指南
原生datetime.now()获取本地时间,不带时区属性,属于 naive时间,跨服务器比对会报错。带时区时间使用datetime.astimezone,强制绑定东八区时区。禁止手动加减8小时修改时差,夏令时更新会导致时间错误。时间计算:timedelta直接实现天数、小时增减,无需手动换算秒数。字符串解析使用strptime,格式化使用strftime,格式符号严格区分大小写,%Y四位年份、%y两位年份极易写错。线上时间异常大多源于时区不统一。 yc.ahsalar.com qsvsnks.yihucx.com tongjiang.xilaohan.com lq.aasmile.com xj.banutech.net
前端开发基于history.js的HTML5与HTML4浏览器兼容方案:单页应用无刷新历史状态管理技术实现-jcbbroJ3l1792421687
内容概要:本文系统介绍了如何利用history.js实现单页应用(SPA)在HTML5c与HTML4浏览器间s草错发的无缝历史状态管理。通过封装原生History API并在不支持的浏览器中自动降级为哈希路由,history.js解决了因浏览器兼容性导致的后退按钮失效、URL混乱等问题。文章详细讲解了其核心机制,包括状态对象管理、自动模式切换(HTML5 pushState vs HTML4 哈希)、状态数据持久化以及针,对Safari、IE等浏\览器的兼容性修复方案,并提供了从入门到实战的完整示例,涵盖初始化、事,件监听、页面加载及性能优化技巧。;jcbbroJ3l1792421687 www.kfshiye.com www.wap.kfstjx.com www.kuaicai-mro.com lianyingjs.com www.kdd888.com
MATLAB实现了约束感知混合水波和灰狼优化,用于作物规划。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。


非技术版
