SQL/VBA插入问题
我正在尝试创建一个用户列表,具体取决于谁使用我的excel电子表格 其想法是,当用户打开工作簿时,“打开”脚本将下载用户列表,检查该用户是否存在,如果不存在,则将其添加到其中 现在,我可以使用存储过程下载用户详细信息,但只要我在其中添加一行以检查用户是否存在,如果不添加用户,VBA就会抛出一个错误,声明“对象关闭时不允许操作” VBA代码:SQL/VBA插入问题,sql,sql-server,vba,excel,Sql,Sql Server,Vba,Excel,我正在尝试创建一个用户列表,具体取决于谁使用我的excel电子表格 其想法是,当用户打开工作簿时,“打开”脚本将下载用户列表,检查该用户是否存在,如果不存在,则将其添加到其中 现在,我可以使用存储过程下载用户详细信息,但只要我在其中添加一行以检查用户是否存在,如果不添加用户,VBA就会抛出一个错误,声明“对象关闭时不允许操作” VBA代码: Sub UserDL() Dim us As Worksheet Dim USArr(0 To 11) As Variant Dim sKey As Str
Sub UserDL()
Dim us As Worksheet
Dim USArr(0 To 11) As Variant
Dim sKey As String
Application.ScreenUpdating = False
With UserList
.RemoveAll
.CompareMode = vbTextCompare
End With
ThisUser = Environ("userdomain") & "\" & Environ("username")
Call ConnecttoDB
Set Cmd = New ADODB.Command: Set rs = New ADODB.Recordset
With Cmd
.CommandTimeout = 30
.ActiveConnection = cn
.CommandText = "CSLL.DLUsers"
.CommandType = adCmdStoredProc
.Parameters("@Alias").Value = Environ("userdomain") & "\" & Environ("username")
Set rs = .Execute
End With
With rs
If Not .BOF And Not .EOF Then
.MoveLast
.MoveFirst
While (Not .EOF)
On Error Resume Next
If (IsNull(rs("FirstName")) Or IsNull(rs("LastName"))) = True Then
Call AliasDet(rs("Alias"))
End If
On Error GoTo 0
For i = 1 To 11
USArr(i - 1) = rs(i)
Next i
With UserList
sKey = rs("Alias")
If Not .Exists(sKey) Then
.Add sKey, USArr
End If
End With
.MoveNext
Wend
End If
End With
Set Cmd = Nothing: Set rs = Nothing
End Sub
SQL存储过程:
@Alias as varchar(max)
AS
IF NOT EXISTS(SELECT 1 FROM [CSLL].[Users] WHERE [Alias] = @Alias) INSERT INTO [CSLL].[Users] ([Alias], [Country], [Role]) VALUES (@Alias, 'UK', 'Employee')
SELECT * FROM [CSLL].[Users]
有人能帮助解释为什么当用户不存在时它会抛出错误(如果用户确实存在,那么它运行正常,因此我认为这与SQL存储过程有关,但看不到位置)这可能是由于
INSERT
语句试图从存储过程返回值造成的。尝试将设置为不计数代码>位于存储过程顶部,以防止返回受影响的记录计数:
[SP Header and Parameters]
AS
SET NOCOUNT ON; -- Prevent insert from returning a result.
IF NOT EXISTS(SELECT 1 FROM [CSLL].[Users] WHERE [Alias] = @Alias)
BEGIN
INSERT INTO [CSLL].[Users] ([Alias], [Country], [Role]) VALUES (@Alias, 'UK', 'Employee');
END
SELECT * FROM [CSLL].[Users]
sql中没有任何东西看起来不合适。当然,我看不到表,所以我不知道这些列是否存在。你真的需要varchar(最大值)吗?我建议不要使用sql保留字来命名对象和列名。我会启动探查器,看看你的进程是否在用户不存在的情况下执行。我已经进行了双重检查和三次检查-所有列都存在(在SQL相当新,没有意识到Alias是一个保留字)。此表可以与其他存储过程一起使用,IF语句和select语句本身也可以使用。只有当它们组合在一起,并且if语句为真时,它才会失败。同样,在MSSMS中以查询的形式运行它也能很好地工作,并返回完整的表(如预期的那样),如果用户不存在,它似乎不想在vba中填充记录集。如果用户确实存在,则会填充记录集:S