I am new to this but trying to get it worked out, hoping to find some advice here.
My setup:
Excel 2016 64 Bit
SQL Server 2014 Import and Export Data (64-Bit)
Windows 7 64 Bit
Windows PowerShell ISE (x86)
Microsoft OLE DB Provider for SQL Server
I can export my SQL database perfectly into excel, now I'm just trying to automate it. Here is the code I am currently using:
PowerShell lines
$serverName = "E2\E2SQL";
$databaseName = "*****";
$uid ="*****"
$pwd = "*****"
#the save location for the new Excel file
$filepath = "C:\Users\Bob\Desktop\TEST.xls";
#create a Dataset to store the DataTable
$dataSet = new-object "System.Data.DataSet" "TEST"
#create a Connection to the SQL Server database
$cn = new-object System.Data.SqlClient.SqlConnection "server=$serverName;database=$databaseName;Integrated Security=false; User ID = $uid; Password = $pwd;"
$query= "SELECT JobNo FROM Online;"
#Create a SQL Data Adapter to place the resultset into the DataSet
$dataAdapter = new-object "System.Data.SqlClient.SqlDataAdapter" ($query, $cn)
$dataAdapter.Fill($dataSet) | Out-Null
#close the connection
$cn.Close()
I get an error on
$dataSet = new-object "System.Data.DataSet" "TEST"
I don't really understand that line of code... Anyway any thoughts on how to get this working are greatly appreciated!
I would also be open to exporting to a CSV if that makes it easier.
Related
Hi i'm completely new to this ,i want to store capacity in particular format. Mycode showing correct format but in SQL database its value is getting changed to default.
My code:
$SSDCapacity= Get-Disk | select Size
foreach($size in $SSDCapacity)
{
$variable = $size.Size.ToString()
}
$result = $variable.SubString(0,3)
$result
Above code shows output as 512 in powershell.
But when i store it in database its showing in default form #{Size=512110190590}
I have a insert query for SQL Part
$InsertQuery="INSERT INTO [$($Database)].[dbo].[$($name)]
([ComputerName],[Model],[SSDCapacity])
VALUES('$ComputerNameValue','$ModelValue','$result')
"
then i'm just calling above query for insert
#Insert into Table
$SqlCmd.CommandText = $InsertQuery
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
#Creating Dataset
$Datatable = New-Object "System.Data.Datatable"
$result = $SqlCmd.ExecuteNonQuery()
$conn.Close()
So how can i store in format powershell shows.
I might be missing out some silly things here.
Any help will be thankfull.
You could do that in one line using DBATOOLS
Install-Module dbatools -Scope CurrentUser #only once
Get-DbaDiskSpace|select ComputerName, Name, Capacity, Free|Write-DbaDataTable -SqlInstance $sql -Database TEMPDB -Table disk -AutoCreateTable
I have a code running to import CSV files into a Access database. However now I have access to a SQL server and want to use the same code if possible, but no idea what to change to adapt the code
I have a set of running code which uses a connection string I add parameters and it works.
$connectionString="Provider=Microsoft.Ace.OLEDB.12.0; Data Source=$inputDatabase"
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)
$conn.Open()
$cmd = $Conn.CreateCommand()
$cmd.CommandText = "INSERT INTO [Tabl1]([date],[zone],[location],[Plugin ID],[CVE],[CVSS],[Risk],[Host],[Protocol],[Port],[Name])
VALUES(#date, #zone, #location, #PluginID, #CVE, #CVSS, #Risk,#Host,#Protocol,#Port,#Name)"```
[void]$cmd.Parameters.Add('#date', [System.Data.OleDb.OleDbType]::DateTime)
[void]$cmd.Parameters.Add('#zone', [System.Data.OleDb.OleDbType]::VarChar)
both code snippets above show how I set up my connection string, and a quick example of how 2 values are set with their corresponding variable type, it is not the whole code . but the snippets I know I need to change to make it work with an SQL server, the main issue being that i dont know which $connectionstring to use with an SQL server, or for example how do I make it so the data source points to the SQL server network address and uses windows authentication.
And on the second code snippet, which type of format do I use, I knwo the variable types but I assume that if I change from ace.oledb.12 , i should change the oldebtype segment. The SQL server is on SQL 13.0.5426
You'll need to update your connection string. Assuming you're using Windows authentication:
$ConnectionString = 'Data Source={0};Initial Catalog={1};Integrated Security=SSPI' -f $ServerInstanceName, $DatabaseName
And you should use the built-in SQL Server client class, System.Net.SqlClient, instead of OLEDB classes.
$conn = New-Object System.Data.SqlClient.SqlConnection $connectionString
And you'll want to update your parameter types:
[void]$cmd.Parameters.Add('#date', [System.Data.SqlDbType]::DateTime)
[void]$cmd.Parameters.Add('#zone', [System.Data.SqlDbType]::VarChar)
Everything else should be more or less identical.
Here's a working PowerShell script that connects to an SQL Server database, fetches data, and fills a data table:
$SqlQuery = 'SELECT * FROM Student WHERE Student_Id = #student_id'
$ConnectionString = 'Data Source={0};Initial Catalog={1};Integrated Security=True' -f $SqlServer, $Database
$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$SqlCommand = New-Object -TypeName System.Data.SqlClient.SqlCommand -ArgumentList $SqlQuery, $SqlConnection
$SqlCommand.Parameters.Add('#student_id', [System.Data.SqlDbType]::VarChar, 10).Value = $Student_Id
$DataTable = New-Object -TypeName System.Data.DataTable -ArgumentList 'Student'
try {
$SqlConnection.Open()
$SqlDataReader = $SqlCommand.ExecuteReader()
$DataTable.Load($SqlDataReader)
}
finally {
$SqlConnection.Close()
}
$DataTable
Hi I saw this power shell script which can connect to power bi and export more data than the normal limit that is allowed from power bi.
This script works and exports to a csv file from power bi, any ideas if this can be acheived through VBA or any other suggestion of a way to connect to power bi desktop (pbix file) using VBA in order to extract data. Or can VBA call power shell?
The reason i'm asking is to export from power bi. You can export data from power bi desktop but there is a limit. One way around this..is this power shell script ..but can it be done from VBA. I'm more familiar with vba and power shell may require system privileges. There is also a way using language 'r' but im asking if you can do it in VBA R way to export fyi.
# Connect using ADOMD.NET (power shell script)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.AdomdClient")
#[Microsoft.AnalysisServices.AdomdClient.AdomdConnection]
# Create the first connection object
$con = new-object Microsoft.AnalysisServices.AdomdClient.AdomdConnection
$con.ConnectionString = "Datasource=$dataSource; Initial Catalog=$Database_Name;timeout=0; connect timeout =0"
$con.Open()
"Datasource= " +$dataSource
"Database_Name= " +$Database_Name
$filename = "Table1.csv"
# Create a command and send a query
$command = $con.CreateCommand()
$command.CommandText = $query
$adapter = New-Object -TypeName Microsoft.AnalysisServices.AdomdClient.AdomdDataAdapter $command
$dataset = New-Object -TypeName System.Data.DataSet
$adapter.Fill($dataset)
$dataset.Tables[0] | export-csv $filename -notypeinformation
# Close the first connection
$con.Close()
Is there any way I can script out all the SQL Server objects (tables, SP, functions etc) under a schema?
In our database we have a table containing name of all the schemas and there are more than 500 schema. Some of them are for dev and some are prod. I need to script out all the objects under dev schema and create a new database.
ApexSQL Script is the tool which can be very helpful in this situation. It is the tool which creates SQL scripts for database objects, and it can script all objects into one script or all objects separately.
For this situation here is what you should do:
Select server and the database which you want to script and load them.
Go to the View tab and click the “Object filter” button, then select the “Edit filter” button:
In the Filter editor for all objects select the “Include if:” and “Click here to add filter criteria”:
Select the “Schema”, “Equals” and Enter the desired schema name, then click OK:
Click on the Home tab, check all objects and Click the “Script” button:
In the third step of the Synchronization wizard, under the Script file tab, select if you want to create one script for all objects or for each object individually from the Granularity drop down menu:
In the last step of the Script wizard click the Create button and check out the results – you will have the script which can be executed in the SQL Server Management Studio.
Thanks guys for your reply. I have solved this by generating all the scripts through SSMS and then created a schema only database. Than I dropped all the tables, views SP, functions etc those are not part of the schema I do not need.
It took me around 20 mins to do that. But after all the work is done.
This is PowerShell answer to your problem.
$Server= 'SERVER_NAME'
$Database= 'DATABASE_NAME'
$SmoScriptPath = 'SCRIPT_OUTPUT.SQL'
$Schemas = #("dlo", "deo") # include objects that fall under this schema set
$ObjectTypes = #("StoredProcedures", "Views", "Tables") #object types to be included
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
$SmoServer = new-object "Microsoft.SqlServer.Management.SMO.Server" $Server
$SmoServer.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View], "IsSystemObject")
$SmoDb = New-Object "Microsoft.SqlServer.Management.SMO.Database"
$SmoDb = $SmoServer.Databases[$Database]
$SmoScr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
$SmoScr.Server = $SmoServer
$SmoScr.Options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"
$SmoScr.Options.AllowSystemObjects = $false
$SmoScr.Options.IncludeDatabaseContext = $true
$SmoScr.Options.IncludeIfNotExists = $false
$SmoScr.Options.ClusteredIndexes = $true
$SmoScr.Options.Default = $true
$SmoScr.Options.DriAll = $true
$SmoScr.Options.Indexes = $true
$SmoScr.Options.NonClusteredIndexes = $true
$SmoScr.Options.IncludeHeaders = $false
$SmoScr.Options.ToFileOnly = $true
$SmoScr.Options.AppendToFile = $true
$SmoScr.Options.ScriptDrops = $false
$SmoScr.Options.Triggers = $true
$SmoScr.Options.ExtendedProperties = $true
$SmoScr.Options.FileName = $SmoScriptPath
New-Item $SmoScr.Options.FileName -type file -force | Out-Null
Foreach ($ObjectType in $ObjectTypes) {
$Objects = $SmoDb.$ObjectType | where {$_.IsSystemObject -eq $false -and $Schemas.Contains($_.Schema)}
Foreach ($Object in $Objects | where {$_ -ne $null})
{
$SmoScr.Script($Object)
}
}
If you are looking for a solution for getting these objects scripted on a schedule and checked into a GIT Repo Automatically.
Check out the following project I have shared: https://github.com/Drazzing/mssqlobjectstogit
What you get:
Changes to MS SQL Objects over time in [GIT]
Report that shows who Added / Deleted / Changed the objects over time [CSV]
Report Example:
You can use Redgate SQL Compare
or
use management studio generate script feature.
I am looking for some Power Shell script to fetch data from a SQL Server table using windows authentication and write it back to .txt file.
I am very new to Power Shell thing and never worked on this before. So if somebody could guide me in this effort.
Thanks to both of you guys. I am able to google and make a script working according to requirement.
Here it is
#Script parameters
param(
#Name of MS SQL Server instance
[parameter(Mandatory=$true,
HelpMessage="Specify the SQL Server name where will be run a T-SQL code",Position=0)]
[String]
[ValidateNotNullOrEmpty()]
$server = $(throw "sqlserver parameter is required."),
#Database name for execution context
[parameter(Mandatory=$true,
HelpMessage="Specify the context database name",Position=1)]
[String]
[ValidateNotNullOrEmpty()]
$dbname = $(throw "dbname parameter is required.")
)
$connectionString = “Server=$server;Database=$dbname;Integrated Security=True;”
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$query = “SELECT type,name FROM sys.tables"
$command = $connection.CreateCommand()
$command.CommandText = $query
$result = $command.ExecuteReader()
$table = new-object “System.Data.DataTable”
$table.Load($result)
$table | Out-File D:\test\swedes$dbname.txt
$connection.Close()
Now I am looking for a way to run this script on a remote SQL Server and save the results.
I am googling about this but still if someone knows a way to run this script using SSIS please help.