如题。
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
请问这个该怎么写成一个存储过程呀!!!谢谢!!!!
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)
前辈你好。这个写的不太对呀!
@紫秋: 你的语句本身就不完整。
我这里给你的方案是:可以在insert的时候,通过select提供数据给insert。当然,你要保证数据的条数,此时要有top 1,同时,后面的语句也要完善起来。
@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 失败。
@紫秋: 写法是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
你比较下我的代码与你原来代码的优劣。
@醉成风思成雨: 前辈你好呀。AppServerID的默认值是((0))。我按照你说的,修改为SELECT isnull([AppServerID],(0)),结果还是一样的错误。
但是我若是把isnull([AppServerID],默认值)直接写为一个数字,比如说1啦,0啦,或者2啦,都可以插入成功!
所以我猜想还是存储过程写的有问题!!!
@519740105: 嗯,我不知道该怎么说。刚开始学SQL,只知道用哪些语句能出结果。
就是觉得你写的比我好,但是我说不出来。
而且,我刚才把你写的运行了一下。数据可以成功插入。(AppServerID的默认值为0,所以该列插的是0)
我之前写的就插不进去,还报错。
@紫秋: 看来你对SQL的使用少了点,没事,多用用就知道,可以看看SQL方面的书,初学有很多可以学的,常见函数啊,左连接 右连接啥的,重点是思路要清楚
@519740105: 我搞错了哇。
现在数据是插不进去的。
[AppServerID]是ApplicationLog表的外键,默认为0;是AppServerConnection的主键,不能为0。
现在在C#中存储过程是可以执行的,但是就是在数据库中插不进去。
@醉成风思成雨: 嗯。。。我也觉得用的少!还是要多写多想,不然遇到稍微综合一点的就不知道怎么办了!
@紫秋: 这个问题就需要你的表结构与关系了,我只是针对你的这个需求简单的给出问题的参考解决方案,具体的解决方案,还是要视具体情况而定。
@519740105: 嗯。结贴吧。真心得谢谢你!前辈!!
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....
前辈你好!你看我这样写对吗!
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
谢谢谢谢。。。
@紫秋: 谢谢你第一个回答!