首页 新闻 会员 周边

SQLServer2008中,存储过程中一个变量的值是由一个子查询得到的。这个该怎么写?

0
悬赏园豆:40 [已解决问题] 解决于 2014-09-22 18:22

如题。

1 INSERT INTO [ApplicationLog]
2        ([AppServerID],[Class],[Level])
3 VALUES(@[AppServerID],@[Class],@[Level]);
4 --其中,AppServerID的值由下面的查询得到
5 SELECT AppServerID FROM AppServerConnection 
6 WHERE
7 AppID=@AppID AND ServerID=(SELECT a.ServerID FROM PCServer AS a WHERE a.IntranetIP = @IntranetIP

请问这个该怎么写成一个存储过程呀!!!谢谢!!!!

啊阿强的主页 啊阿强 | 初学一级 | 园豆:166
提问于:2014-09-22 15:22
< >
分享
最佳答案
1
INSERT INTO [ApplicationLog]
        ([AppServerID],[Class],[Level])
        (SELECT AppServerID],@[Class],@[Level] FROM AppServerConnection 
 WHERE
 AppID=@AppID AND ServerID=(SELECT a.ServerID FROM PCServer AS a WHERE a.IntranetIP = @IntranetIP)
收获园豆:35
519740105 | 大侠五级 |园豆:5810 | 2014-09-22 16:17

前辈你好。这个写的不太对呀!

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 16:22

@紫秋: 你的语句本身就不完整。

我这里给你的方案是:可以在insert的时候,通过select提供数据给insert。当然,你要保证数据的条数,此时要有top 1,同时,后面的语句也要完善起来。

519740105 | 园豆:5810 (大侠五级) | 2014-09-22 16:24

@519740105: 你好。根据你的提示,我是这么写的:

 1 CREATE PROCEDURE [dbo].[prInsApplicationLog3]
 2 @AppID int,
 3 @Class nvarchar(512),
 4 @Level nvarchar(512),
 5 @Thread int,
 6 @File nvarchar(512),
 7 @Line int,
 8 @Message nvarchar(MAX),
 9 @TimeGenerated datetime,
10 @CreatedTime datetime,
11 @IntranetIP nvarchar(256)
12 AS
13 BEGIN
14 INSERT INTO [ApplicationLog]
15         ([AppServerID],Class,Level,Thread,[File],Line,Message,TimeGenerated,CreatedTime)
16         VALUES((SELECT [AppServerID] FROM AppServerConnection WHERE AppID=@AppID 
17         AND ServerID=(SELECT a.ServerID FROM PCServer AS a WHERE a.IntranetIP = @IntranetIP)),
18         @Class,@Level,@Thread,@File,@Line,@Message,@TimeGenerated,@CreatedTime);
19 END
20 GO

麻烦你先看下这个写有没有问题呀!另外我在C#中执行这个存储过程,显示如下错误:

异常: 不能将值 NULL 插入列 'AppServerID',表 'Test.dbo.ApplicationLog';列
不允许有 Null 值。INSERT 失败。

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 16:31

@紫秋: 写法是OK的,但最好不要用这样的方式写,你的错误说appserverid为空,明显是你的select语句查询出来是没内容的。

把语句修改为:

CREATE PROCEDURE [dbo].[prInsApplicationLog3]
    @AppID int,
    @Class nvarchar(512),
    @Level nvarchar(512),
    @Thread int,
    @File nvarchar(512),
    @Line int,
    @Message nvarchar(MAX),
    @TimeGenerated datetime,
    @CreatedTime datetime,
    @IntranetIP nvarchar(256)
    AS
    BEGIN
    INSERT INTO [ApplicationLog] ([AppServerID],Class,Level,Thread,[File],Line,Message,TimeGenerated,CreatedTime)
        (SELECT top 1 [AppServerID], 
                @Class,@Level,@Thread,@File,@Line,@Message,@TimeGenerated,@CreatedTime
             FROM AppServerConnection a inner join PCServer b on a.serverid=b.serverid 
                WHERE a.AppID=@AppID
                    and b.intranetip=@intranetip
         )
    END
GO

你比较下我的代码与你原来代码的优劣。

519740105 | 园豆:5810 (大侠五级) | 2014-09-22 16:42

@醉成风思成雨: 前辈你好呀。AppServerID的默认值是((0))。我按照你说的,修改为SELECT isnull([AppServerID],(0)),结果还是一样的错误。

但是我若是把isnull([AppServerID],默认值)直接写为一个数字,比如说1啦,0啦,或者2啦,都可以插入成功!

所以我猜想还是存储过程写的有问题!!!

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 17:19

@519740105: 嗯,我不知道该怎么说。刚开始学SQL,只知道用哪些语句能出结果。

就是觉得你写的比我好,但是我说不出来。

而且,我刚才把你写的运行了一下。数据可以成功插入。(AppServerID的默认值为0,所以该列插的是0)

我之前写的就插不进去,还报错。

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 17:33

@紫秋: 看来你对SQL的使用少了点,没事,多用用就知道,可以看看SQL方面的书,初学有很多可以学的,常见函数啊,左连接 右连接啥的,重点是思路要清楚

风醉 | 园豆:1197 (小虾三级) | 2014-09-22 17:44

@519740105: 我搞错了哇。

现在数据是插不进去的。

[AppServerID]是ApplicationLog表的外键,默认为0;是AppServerConnection的主键,不能为0。

现在在C#中存储过程是可以执行的,但是就是在数据库中插不进去。

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 17:46

@醉成风思成雨: 嗯。。。我也觉得用的少!还是要多写多想,不然遇到稍微综合一点的就不知道怎么办了!

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 17:47

@紫秋: 这个问题就需要你的表结构与关系了,我只是针对你的这个需求简单的给出问题的参考解决方案,具体的解决方案,还是要视具体情况而定。

519740105 | 园豆:5810 (大侠五级) | 2014-09-22 18:12

@519740105: 嗯。结贴吧。真心得谢谢你!前辈!!

啊阿强 | 园豆:166 (初学一级) | 2014-09-22 18:21
其他回答(1)
-1

Declare @AppServerID nvarchar(50) --- or int

 

Select @AppServerID=AppServerID FROM AppServerConnection WHERE AppID=@AppID

AND ServerID=(SELECT a.ServerID FROM PCServer AS a WHERE a.IntranetIP = @IntranetIP

 

Insert into....

收获园豆:5
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-22 15:28

前辈你好!你看我这样写对吗!

 1 SET ANSI_NULLS ON
 2 GO
 3 SET QUOTED_IDENTIFIER ON
 4 GO
 5 
 6 CREATE PROCEDURE [dbo].[prInsApplicationLog2]
 7 @AppID int,
 8 @Class nvarchar(512),
 9 @Level nvarchar(512),
10 @Thread int,
11 @File nvarchar(512),
12 @Line int,
13 @Message nvarchar(MAX),
14 @TimeGenerated datetime,
15 @CreatedTime datetime,
16 @IntranetIP nvarchar(256)
17 AS
18 BEGIN
19 Declare @AppServerID int
20 Select @AppServerID=AppServerID FROM AppServerConnection WHERE AppID=@AppID
21 AND ServerID=(SELECT a.ServerID FROM PCServer AS a WHERE a.IntranetIP = @IntranetIP)
22 INSERT INTO ApplicationLog
23 (AppServerID,Class,Level,Thread,[File],Line,Message,TimeGenerated,CreatedTime)
24     VALUES
25     (@AppServerID,@Class,@Level,@Thread,@File,@Line,@Message,@TimeGenerated,@CreatedTime)
26 END
27 GO

谢谢谢谢。。。

支持(0) 反对(1) 啊阿强 | 园豆:166 (初学一级) | 2014-09-22 16:03

@紫秋: 谢谢你第一个回答!

支持(0) 反对(0) 啊阿强 | 园豆:166 (初学一级) | 2014-09-22 18:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册