为什么从sp_executesql存储值会返回NULL?

时间:2015-04-30 09:55:23

标签: ssms

我再一次偶然发现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 语句出现时输出,否则不是

1 个答案:

答案 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;
}

改变了什么?

  • 为了便于阅读,我宣布了一个额外的@params变量
  • 而不是设置选择 -ed @sql 变量
  • 引用名称现在围绕 @TableName 变量
  • 而不是 sp_executesql 的最后一个参数 @x = @y output 我只是将其替换为 @y output

结论

经过多次测试(主要是删除了一些更改),我可以得出结论,该列表中的最后一点是解决问题的关键。
从语句中删除引号后,我仍然设法将结果保存在变量中,并且因为 @param 变量不是强制性的,而是个人偏好,所以它也是没有实际意义。