我再一次偶然发现SQL错误。以下代码:
create trigger tc_trigger_olt_UPDATE on tick_orderline_type
for update as
declare @UserId varchar(32) --
declare @ClientId varchar(32) --
declare @CaseId varchar(32) --
declare @TableName varchar(64) --Used
declare @RecordId varchar(512) --Used
declare @Descr varchar(128) --
declare @RemoteIP varchar(16) --Used
select @TableName = object_name(parent_id) from sys.triggers where object_id = @@procid
select @RemoteIP = client_net_address from sys.dm_exec_connections where Session_id = @@SPID
if exists(select * from information_schema.columns where table_name = @TableName and column_name = 'id')
begin
select @RecordId = id from inserted
end
declare @sql nvarchar(max)
set @sql = 'select case_id from '+@TableName+' where id = '''+@RecordId+'''';
exec sp_executesql @sql, N'@out_param varchar(32) OUTPUT', @out_param=@CaseId OUTPUT
execute update_tick_orderline_type @UserId, @ClientId, @CaseId, @TableName, @RecordId, @Descr, @RemoteIP
用于SSMS中的填充和审计表,这是有效的。它存储哪个表,哪个记录,哪个日期以及从哪个IP地址编辑该表。
我目前正在尝试获取哪些客户端的数据,在这种情况下,使用上面的剪辑进行了编辑:
declare @sql nvarchar(max)
set @sql = 'select case_id from '+@TableName+' where id = '''+@RecordId+'''';
exec sp_executesql @sql, N'@out_param varchar(32) OUTPUT', @out_param=@CaseId OUTPUT
在我的结果窗口(显示选择语句结果的窗口)中,我可以看到 @sql 语句选择了正确的 case_id ;然后将其存储在 @CaseId 变量中,返回 NULL 。一旦我拥有了 @CaseId ,我就可以获得 @ClientId ,所以我在这里难倒。
为什么语句输出正确的 case_id ,但将其存储为 NULL ?
一个小注释: case_id 仅在 exec 语句出现时输出,否则不是
答案 0 :(得分:2)
通过将之前的'select x from @TableName'块更改为:
,我设法解决了自己的困境。public boolean isSongString (String s){
int i = 1;
int j = 1;
char a = s.charAt(i);
while (i < s.length()){
{
if(a == 'd' | a == 'r' | a == 'm' | a == 'f' | a == 's' | a == 'l' | a == 't')
j++;
else
break;
}
i++;
}
if (j == s.length())
return true;
else
return false;
}
经过多次测试(主要是删除了一些更改),我可以得出结论,该列表中的最后一点是解决问题的关键。
从语句中删除引号后,我仍然设法将结果保存在变量中,并且因为 @param 变量不是强制性的,而是个人偏好,所以它也是没有实际意义。