当前位置: 代码迷 >> VFP >> SQL表用代码设置默认值,奇了怪!解决办法
  详细解决方案

SQL表用代码设置默认值,奇了怪!解决办法

热度:5971   发布时间:2013-02-26 00:00:00.0
SQL表用代码设置默认值,奇了怪!
第一次用代码自动设置SQL表默认值,全部有效,将表名不同但字段相同的同一数据库下的另一表再运行代码,全部无效,如将另一表改动几个不同的字段名称,改动的有效。就是已经设置过默认值的,不管是另一个表只要字段名称相同就无法自动设置默认值,这SQL是到底是这么规定的,那儿出了问题,有请高手帮忙,谢谢!

自动设置默认值代码如下:

SQLEXEC(nhandle,"select * from ckckzz","tmp1")
SELECT tmp1
COPY STRUCTURE EXTENDED TO FileName  
USE FileName  
SCAN
  kk=ALLTRIM(field_name)
  DO case
  CASE field_type="C"
  SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT &kk default space(2) for &kk") &&字符型默认为二个空格
  CASE field_type="N" OR field_type="L"
  SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT &kk default 0 for &kk") &&数值型或逻辑型默认为0
  ENDCASE
ENDSCAN

------解决方案--------------------------------------------------------
alter table ckckzz add CONSTRAINT &kk default space(2) for &kk

其实你注意一下语法中这个 &kk 是什么意义就明白了。

ALTER TALBE ...ADD CONSTRAINT constraint_name DEFAULT constant_expression FOR column 
红字部分对应的是约束名,而约束名在数据库中是不可以重复的。 你可以在字段名前再加个表名一同构成约束名。
------解决方案--------------------------------------------------------
探讨
谢谢楼上,我加了数据表名还是无效。
直接打开表设置是可以的,是否说明不同的表,同名约束是可以的
为什么用代码设置就不可以了
因为我有很多的表要设置默认值,但总有几个表有几个字段相同的,麻烦不小,我要去检查
如没有设置默认值,后台到前台搞个NULL,统计时就有麻烦了,所以我一定要全部设置好
还请高手指点迷津,谢谢!


------解决方案--------------------------------------------------------
请参考:

Set Talk Off
Set Safe Off
Public nhandle
nhandle=Sqlstringconnect("driver=sql server;server=yjr;uid=sa;pwd=12;database=msgl")
If nhandle<=0
Messagebox("连接失败")
Return
Endif
SQLExec(nhandle,"select * from ckckzz","tmp1")
Select tmp1
Copy Structure Extended To FileName
Use FileName
*Brow
lcTableName='ckckzz1' &&第一个表名,此处改为你的实际表名
Scan
kk1=lcTableName+"_"+Alltrim(field_name)
kk2=Alltrim(field_name)
Do Case
Case field_type="C"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default ' ' for &kk2.") &&字符型默认为二个空格
Case field_type="N" Or field_type="L"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default 0 for &kk2.") &&数值型或逻辑型默认为0
Endcase
Endscan
lcTableName='ckckzz2' &&第二个表名,此处改为你的实际表名,与第一个表名字段一样
Scan
kk1=lcTableName+"_"+Alltrim(field_name)
kk2=Alltrim(field_name)
Do Case
Case field_type="C"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default ' ' for &kk2.") &&字符型默认为二个空格
Case field_type="N" Or field_type="L"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default 0 for &kk2.") &&数值型或逻辑型默认为0
Endcase
Endscan

------解决方案--------------------------------------------------------
探讨
同一数据库内部不允许同名约束,在帮助中找不到理论支持
  相关解决方案