只有视图的 Select 和视图定义权限,是否可以从 Excel 发送 SQL 查询而不需要每次都键入查询?

With only the Select and View Definitions permission on a view, can SQL queries be sent from Excel without needing to type the query each time?

我认为我的用户通常一次只需要检查一个特定的人。为此,他们在 Excel 365 桌面版中执行以下操作:

  1. 打开空白工作簿
  2. 单击 'Data' 功能区
  3. 点击'Get Data'
  4. 点击'From Database'
  5. 点击'From SQL Server Database'
  6. 填写 'Server' 和 'Database' 字段
  7. 在高级选项中,输入SELECT * FROM [VEIWS].[VIEW_NAME] WHERE [EMP.ID] = '123456'
  8. 单击“确定”。

这对我的用户来说很乏味。如果他们想检查另一个人,他们必须重复整个过程。我希望他们能够使用查询编辑器并更改唯一重要的行(参见第 7 步),但他们只有 Select 和查看定义权限,这会导致查询编辑器抱怨。恐怕我没有具体的错误信息,但肯定与权限有关。

从 Excel 开始有没有重复性较低的方法?在一个理想的世界中,我只是制作一个 sheet 让他们立即输入 EMP.ID 然后获取信息。我认为这可以用宏来完成,但它们从来不是我的首选,而且似乎要求我在工作簿中保存密码。

请注意,我的用户不能只获取整个视图并在 Excel 中对其进行过滤。 Excel 处理的行太多。

我不知道你遇到了什么权限错误,但人们通常使用 Windows 凭据而不是数据库凭据并卡住。 Power Query 将凭据保存在每台计算机上,因此您依赖它们正确登录。有人第一次连接到数据源时,系统会提示他们输入凭据。默认是 Windows 凭据,他们可能需要输入数据库凭据。如果他们弄错了,他们必须进入数据源设置以编辑或清除凭据以修复它。

就更改 SQL 中的值而言,您可以轻松地在 Excel 中使用一个参数来更改查询中的 EMP.ID 值。 Ken Puls 对这个过程有一篇很好的文章 here。如果遇到问题,请回复。

您可以在 Excel 中使用带数据透视表的 SSAS 多维数据集,并在 EMP.ID 上使用过滤器。

我想如果没有 Power Query 编辑器就无法更改 Excel 中的查询,而且我认为它不打算这样做(常规)。

如果不需要 Excel 您的云只需使用 SSMS 或任何类似的替代方法。

您是否尝试 Un-tick 显示“新的本机数据库查询需要用户批准”的框?

您可以按照上面的建议将 ID 设置为参数...检查我的示例文件中是否有 运行 和带有参数的 SQL 查询。 Sample File

您还可以自动刷新工作表,例如:

Private Sub Worksheet_Change(ByVal Target As Range)
     
    
    If Intersect(Target, Me.Range("datachange")) Is Nothing Then Exit Sub
    
    Application.EnableEvents = False 'to prevent endless loop
    
    'Application.Goto Reference:="Tum_Santiyelerin_Satinalinan_Malzemeleri"
    Range("EMP_ID").ListObject.QueryTable.Refresh BackgroundQuery:=False
    
    ActiveWorkbook.RefreshAll
    Application.EnableEvents = True

End Sub

我以前有过类似的需求。我的解决方案是使用 QueryTables 对象使用来自工作表单元格的 user-supplied 数据向数据库发送查询。它确实使用了宏,但我不必在工作簿中保存凭据。

此解决方案需要 SQL 服务器的 ODBC 驱动程序。

(我似乎记得我还必须检查 Visual Basic 中的参考资料 - 在工具栏工具>参考资料中 - 但那是不久前的事了,我不记得确切的细节。)

将下面的 vb 代码添加到新工作簿。然后,如果您在 Sheet1 的单元格 A1 中输入 [EMP.ID] 值和 运行 宏 'ReadData',它将提取记录并从单元格 A3 开始显示它们。

将工作簿另存为 macro-enabled.xlsm,然后可以与您的用户共享。 (您还可以将宏分配给键盘快捷键或命令按钮,以加快用户的操作速度。)

(此方法尝试使用受信任的连接连接到数据库,即使用 windows log-in 凭据。我还使用另一个需要单独凭据的数据库。我在下面有另一个示例场景。)

宏的 vb 代码如下。检查连接字符串是否具有正确的驱动程序和服务器 IP 地址等,以及读取正确的查询字符串 table.

Sub ReadData()
''' read database using filter supplied in cell A1

Dim ConnectionString As String
Dim QueryString As String


' Create connection string using credentials
ConnectionString = "ODBC; DRIVER={SQL Server}; SERVER=XX.XX.X.XXX; DATABASE=XXXXXXXXX; SCHEMA=dbo; REGION=yes;"
    
' Create query string to read data using value of cell A1
QueryString = "SELECT * FROM [VEIWS].[VIEW_NAME] WHERE [EMP.ID] = '" & Range("Sheet1!A1").Value & "'"

' The lines below can be un-commented if you get errors - it might help with debugging
'Range("Sheet1!C1").Value = ConnectionString
'Range("Sheet1!C2").Value = QueryString

' This code sends the query to the database and drops the results starting at cell A3
With Sheets("Sheet1").QueryTables.Add(Connection:=ConnectionString, _
        Destination:=Range("Sheet1!A3"), Sql:=QueryString)
    .RefreshStyle = xlOverwriteCells    ' this stops excel from inserting new columns when the query is re-run
    .Refresh False
End With
    
' Remove connections to avoid wasting memory
For Each con In Sheets("Sheet1").QueryTables
    con.Delete
Next

End Sub

当数据库需要不同的凭据时 为此,我创建了一个用户表单来获取用户名和密码,然后将其合并到连接字符串中。

我遵循的步骤是:

  1. 在新的工作簿中,转到 Visual Basic 并创建一个新的用户窗体。 Re-name 登录表单
  2. 在表单上创建 2 个文本框,分别命名为用户名和密码。 (您还可以添加标签并将 PasswordChar 设置为“*”,使其看起来更像登录 window。)
  3. 创建命令按钮('OK' 或 'Done')。右键单击它并 select 查看代码。在代码 window 中输入 Me.Hide 行,使其看起来像:
    Private Sub CommandButton1_Click()
        Me.Hide
    End Sub
  1. 宏的 vb 代码更改为:
Sub ReadData()
''' read database using filter supplied in cell A1

Dim ConnectionString As String
Dim QueryString As String

' First time you run, need to show form to get credentials
If LoginForm.Username = "" Or LoginForm.Password = "" Then LoginForm.Show

' Create connection string using credentials
ConnectionString = "ODBC; DRIVER={SQL Server}; SERVER=XX.XX.X.XXX; DATABASE=XXXXXXXXX; SCHEMA=dbo; REGION=yes; uid=" _
    & LoginForm.Username & "; pwd=" & LoginForm.Password
    
' Create query string to read data
QueryString = "SELECT * FROM [VEIWS].[VIEW_NAME] WHERE [EMP.ID] = '" & Range("Sheet1!A1").Value & "'"

' The lines below can be un-commented if you get errors - it might help with debugging
'Range("Sheet1!C1").Value = ConnectionString
'Range("Sheet1!C2").Value = QueryString

' This code sends the query to the database and drops the results starting at cell A3
With Sheets("Sheet1").QueryTables.Add(Connection:=ConnectionString, _
        Destination:=Range("Sheet1!A3"), Sql:=QueryString)
    .RefreshStyle = xlOverwriteCells    ' this stops excel from inserting new columns when the query is re-run
    .Refresh False
End With
    
' Remove connections to avoid wasting memory
For Each con In Sheets("Sheet1").QueryTables
    con.Delete
Next

End Sub

现在,用户第一次 运行 输入代码时,系统会提示他们输入用户名和密码,但在接下来的会话中,系统会继续使用这些值。当工作簿关闭时,它们不会被保存。 (如果宏遇到错误,下次 运行 时可能会再次要求他们提供凭据)。

希望对您有所帮助。我前段时间做过这项工作,我可能忘记了是否还需要其他 set-up 要求。