SQL Server 数据库排序规则报错“由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN fid 失败”解决办法

本文讲述了在调整数据库表列排序规则时遇到的问题,如何通过删除主键、更改排序并重新创建来解决,同时提醒了对主键列排序设置notnull的重要性。关键步骤包括删除主键约束、修改collate为Chinese_PRC_CS_AS,并最终创建新的主键。

1、问题描述

(1)业务操作时报错:

(2)调整相关表列的排序规则为Chinese_PRC_CS_AS,无法更改

消息 5074,级别 16,状态 1,第 1 行
对象'CPK_BAS_EQUIPMETKI' 依赖于 列'fid'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN fid 失败。

2、解决步骤

(1)先删除主键

alter  TABLE [dbo].[CT_BAS_EQUIPMENT] drop   CONSTRAINT [CPK_BAS_EQUIPMETKI] ;

(2)再改排序:

alter table  [dbo].[CT_BAS_EQUIPMENT] alter column  fid varchar(44)  COLLATE Chinese_PRC_CS_AS  not null;

(3)再创建主键

(4)检查列排序是否改成功

3、注意

(1)对主键列排序调整,要在后后面加上not null,否则列会变为null;
(2)把Chinese_PRC_CI_AS改为Chinese_PRC_CS_AS获取语句:
select ' ALTER TABLE '+sys.tables.name+' ALTER COLUMN '+sys.columns.name+' ' + sys.types.name + '('+ cast(sys.columns.max_length as varchar)+')' +' COLLATE'+' Chinese_PRC_CS_AS' +';' ,sys.tables.name as tablename,sys.columns.name as 字段名, sys.types.name as 字段类型, sys.columns.max_length as 长度, sys.columns.collation_name,sys.columns.is_nullable as 是否可空 from sys.columns, sys.tables, sys.types where sys.columns.object_id = sys.tables.object_id and sys.columns.system_type_id=sys.types.system_type_id  and sys.columns.collation_name='Chinese_PRC_CI_AS'  and sys.tables.name in('表名')

<think>我们根据用户的需求,需要创建一个通达信选股公式,满足以下条件:1.60日与120日均线多头排列(即60日均线在120日均线上方,且两条均线都向上)2.MACD在一前(5个交易日)位于0轴下方3.当前MACD出现金叉(即DIF上穿DEA)另外,参考用户提供的引用[2]中的MACD计算方式,我们使用标准的MACD公式(12,26,9)。步骤:1.计算60日和120日均线,并确保它们多头排列(60日>120日,且两条均线均向上)。2.计算MACD(包括DIF、DEA和MACD柱,但金叉条件我们使用DIF和DEA)。3.一MACD柱小于0(即REF(MACD,5)<0,注意这里MACD柱=2*(DIF-DEA))。4.当前出现MACD金叉(即DIF上穿DEA,也就是DIF>DEA并且前一天DIF<=DEA)。注意:用户要求的是“一MACD位于0轴下方”,我们通常理解MACD位于0轴下方指的是MACD柱(即红绿柱)在0轴下方,但有时也可能指DIF在0轴下方。根据引用[2]中的公式,他们使用了MACD柱(即2*(DIF-DEA))来判断。所以这里我们按照MACD柱小于0来判断。综合以上,我们编写选股公式如下:通达信选股公式源码:```txt{60日120日均线多头+MACD金叉+一MACD<0}{均线设置}MA60:=MA(CLOSE,60);MA120:=MA(CLOSE,120);{均线多头排列:60日线在120日线上方,且两条均线均向上(今日值大于昨日值)}MA_COND:=MA60>MA120ANDMA60>REF(MA60,1)ANDMA120>REF(MA120,1);{MACD计算}DIF:=EMA(CLOSE,12)-EMA(CLOSE,26);DEA:=EMA(DIF,9);MACD:=2*(DIF-DEA);{MACD柱}{一前(5个交易日前)MACD柱在0轴下方}MACD_BELOW0:=REF(MACD,5)<0;{当前MACD金叉:DIF上穿DEA,即今天DIF>DEA且前一天DIF<=DEA}MACD_GOLD:=CROSS(DIF,DEA);{终选股条件}MA_CONDANDMACD_BELOW0ANDMACD_GOLD;```公式说明:1.均线多头排列条件:60日均线大于120日均线,且60日均线和120日均线都比前一日高。2.MACD_BELOW0:5天前的MACD柱(即2*(DIF-DEA))小于0。3.MACD金叉:使用CROSS函数判断DIF上穿DEA。注意事项:1.一前我们取5个交易日,如果用户需要调整,可以修改REF(MACD,5)中的数字。2.均线多头排列的定义也可以根据需要进行调整,例如有些用户可能只要求60日线在120日线上方而不要求均线一定向上(但用户要求了多头排列,所以这里我们要求均线向上)。3.关于MACD在0轴下方,我们使用的是MACD柱(即红绿柱)小于0。如果用户想要DIF在0轴下方,可以改为:REF(DIF,5)<0。如果用户想要的是DIF在0轴下方,则修改条件为:MACD_BELOW0:=REF(DIF,5)<0;但根据用户初的问题描述“一Macd位于0轴下方”,结合引用[2]中的写法(他们使用了MACD柱),我们按照MACD柱来写。如果用户有特别说明,可以调整。使用方法:1.在通达信中打开公式管理器(Ctrl+F),选择“条件选股公式”,新建。2.复制上述代码,设置公式名称(例如:双均线MACD金叉选股)。3.执行选股时,确保数据完整(至少120个交易日数据)。另外,用户如果还想参考基本面条件(如引用[3]),可以自行添加,例如:每股公积金:=FINANCE(18)>2;每股未分配:=FINANCE(32)>1;净资产收益率:=FINANCE(37)>8;{注意:这是近年度的,如果要过去三年需要另外处理}选股条件:=MA_CONDANDMACD_BELOW0ANDMACD_GOLDAND每股公积金AND每股未分配AND净资产收益率;但是,过去三年净资产收益率均在8%以上,在通达信中需要调用年报数据,比较复杂。可以使用以下方法:ROE1:=FINVALUE(37);{近年度}ROE2:=FINVALUE(37,1);{上一年度}ROE3:=FINVALUE(37,2);{再上一年度}ROE_COND:=ROE1>8ANDROE2>8ANDROE3>8;然后加入到选股条件中。由于用户本次问题没有要求基本面,所以我们在公式中没有加入。相关问题:1.如何调整均线多头排列的严格程度?2.MACD金叉和死叉的滞后性问题如何解决?3.如何验证该选股策略在历史回测中的成功率?</think>根据您的要求,我为您创建了通达信选股公式,包含60日/120日均线多头排列(60日在上方)、MACD金叉以及一MACD位于0轴下方的条件: ### 通达信选股公式源码 ```txt { 60/120均线多头 + MACD金叉 + MACD<0 选股公式 } { 均线多头排列条件 } MA60 := MA(CLOSE, 60); MA120 := MA(CLOSE, 120); MA_COND := MA60 > MA120 AND MA60 > REF(MA60, 1) AND MA120 > REF(MA120, 1); { MACD计算 } DIF := EMA(CLOSE,12) - EMA(CLOSE,26); DEA := EMA(DIF,9); MACD := 2*(DIF-DEA); { MACD金叉条件 } MACD_GOLD := CROSS(DIF, DEA); { 一MACD<0条件(5个交易日) } MACD_BELOW0 := REF(MACD, 5) < 0; { 终选股条件 } MA_COND AND MACD_GOLD AND MACD_BELOW0; ``` ### 公式说明 1. **均线多头排列**: ```txt MA_COND := MA60 > MA120 AND MA60 > REF(MA60, 1) AND MA120 > REF(MA120, 1); ``` - `MA60 > MA120`:60日均线在120日均线上方 - `MA60 > REF(MA60, 1)`:60日均线向上 - `MA120 > REF(MA120, 1)`:120日均线向上 2. **MACD金叉**: ```txt MACD_GOLD := CROSS(DIF, DEA); ``` - 使用通达信内置函数`CROSS()`判断DIF上穿DEA形成金叉 3. **MACD位置条件**: ```txt MACD_BELOW0 := REF(MACD, 5) < 0; ``` - `REF(MACD, 5)`:5个交易日前的MACD柱值 - `< 0`:位于0轴下方 ### 策略逻辑解析 该公式结合了三个技术指标形成复合条件: 1. **趋势确认**:$MA_{60} > MA_{120}$ 且双均线向上,确认中期上升趋势 2. **动量反转**:$MACD_{t-5} < 0$ 表明近期处于超卖区域 3. **买入信号**:$DIF \uparrow DEA$ 形成金叉,确认短期动量转强 三个条件形成"趋势确认+超卖反弹+动量金叉"的交易信号体系,可有效筛选处于中期上升趋势且出现买入信号的个股[^1]。 ### 使用说明 1. **安装公式**: - 通达信中按`Ctrl+F`打开公式管理器 - 选择"条件选股公式" → "新建" - 公式名称:`双均线MACD金叉选股` - 粘贴上述源码 2. **执行选股**: - 按`Ctrl+T`打开选股器 - 选择刚创建的公式 - 设置选股范围(推荐全市场) - 点击"执行选股" 3. **数据准备**: - 需下载至少120日历史数据 - 系统菜单 → 盘后数据下载 → 勾选"日线数据" ### 参数优化建议 1. **MACD参数调整**: ```txt { 修改MACD参数示例 } SHORT := 12; { 原12 } LONG := 26; { 原26 } MID := 9; { 原9 } DIF := EMA(CLOSE,SHORT) - EMA(CLOSE,LONG); ``` 2. **时间窗口调整**: ```txt { 修改"一"定义 } DAYS := 5; { 默认5日 } MACD_BELOW0 := REF(MACD, DAYS) < 0; ``` 3. **增加成交量过滤**(参考引用[1]): ```txt { 添加量能条件 } VOL_COND := VOL > MA(VOL,20)*1.2; 选股条件 := MA_COND AND MACD_GOLD AND MACD_BELOW0 AND VOL_COND; ``` ### 注意事项 1. 该公式在**趋势行情**中表现佳,震荡市中可能出现较多假信号 2. 建议结合基本面筛选(参考引用[3]): ```txt { 增加基本面条件 } 每股公积金 := FINANCE(18) > 2; 每股未分配 := FINANCE(32) > 1; 净资产收益率 := FINANCE(37) > 8; 选股条件 := 选股条件 AND 每股公积金 AND 每股未分配 AND 净资产收益率; ``` 3. 对于创业板股票,可将MACD参数调整为(10,20,6)以适应高波动特性 > 该策略的核心优势在于$MA_{60}/MA_{120}$双均线系统过滤主要趋势方向,$MACD$系统提供精确的入场时机[^2],两者结合可有效提高信号质量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值